apache-kafka - 使用 emitEarlywhenFull() 进行翻滚窗口的抑制是如何工作的?
问题描述
我在翻滚窗口上使用抑制来获得汇总结果。我正在探索 untilTimeLimit 和 untilWindowCloses 来抑制。我不希望我的流在缓冲区满时关闭。我已经看到了这个功能 emitEarlyWhenFull() ,但它不能适用于 untilWindowCloses。因此,我选择 untilTimeLImit 和 emitEarlyWhenFull() ,请参考下面的代码:
groupedStreams.windowedBy(TimeWindows.of(Duration.ofMinutes(5)))
.aggregate(() -> initialBlob, blobAggregator,someserde)
.suppress(Suppressed.untilTimeLimit(Duration.ofMinutes(5), new StrictBufferConfigImpl().emitEarlyWhenFull()))
.toStream()
就我而言,我使用翻滚窗户 5 分钟。因此,每 5 分钟,将为每个记录键打开一个窗口。根据文档,当缓冲区填满时,将发送最旧的记录。在同一个翻滚窗口中发送旧记录后,具有相同键的新记录会发生什么?
例如:消息流:(A,1) (A,2) (A,3) -> agg result : (A,6)。假设这里,缓冲区已满,(A,6) 将被发送到下游。让我们假设 (A,4) 现在出现在同一个翻滚窗口中,接下来会发生什么?会是 : (A,10) 还是会从 (A,4) 重新开始?
解决方案
如果suppress()
发出,状态将被保留。因此,对于您的示例,聚合将继续并最终发出 (A,10)。
推荐阅读
- javascript - Django 管理模型。外键弹窗全屏
- javascript - 有没有办法使用通配符迁移 BigQuery 表?
- javascript - 如何使用正则表达式传递两种不同的密码模式?
- android - 互联网可用时同步数据
- http - ResponseWriter.Write 返回的 int 是什么意思?
- python - 如何修改 py2app setup.py 以允许导入我自己的模块?
- c++ - 具有模板化类函数和类型转换的多态性
- firebase - Firebase 用户数据和应用程序数据
- javascript - Vuejs 嵌套循环 3 级子菜单
- python - 编写此 numpy 代码的更有效方法