关于KTable中抑制运算符的容错

时间:2019-01-08 06:15:23

标签: apache-kafka-streams

我们计划在会话窗口KTable上使用抑制运算符。 我们想知道使用抑制运算符时的容错性。

我们知道缓冲区被用来存储事件/聚合,直到窗口关闭。 现在,我们说发生了重新平衡,并且活动任务已移至其他计算机。我们想知道这个(内存中的)缓冲区会发生什么。

让我们说我们正在跟踪用户的点击数。并且我们将会话窗口的非活动时间段配置为3分钟,并且会话窗口已针对密钥alice启动,并且该密钥发生了2分钟的聚合。例如,在缓冲区中,我们有(alice-> 5)条目,表示到目前为止,爱丽丝在此会话中已点击5次。

并说爱丽丝在那之后没有任何活动。

如果一切正常,则会话结束后,下游处理器将获得事件alice-> 5。

但是,如果现在有了重新平衡,并且正在为alice维护会话窗口的活动任务被移动到新计算机上,该怎么办? 由于alice没有进一步的活动,因此在新计算机上运行的下游处理器会错过此事件alice-> 5吗?

1 个答案:

答案 0 :(得分:2)

抑制运算符提供的容错能力类似于Streams中的任何其他状态存储。尽管活动数据结构在内存中,但抑制缓冲区保留一个更改日志(内部Kafka主题)。

因此,当您进行重新平衡时,先前的活动任务会将其状态刷新到更改日志并丢弃内存中的缓冲区。新的活动任务通过重播changelog主题来重新创建状态,从而使缓冲内容完全相同,就好像没有重新平衡一样。

换句话说,就像内存状态存储一样,抑制缓冲区是持久的(在Kafka主题中),即使它不是持久的(在本地磁盘上)。

这有意义吗?