关于 KTable 中抑制运算符的容错
Regarding fault-tolerance for suppress operator in KTable
我们计划在 Session Windowed KTable 上使用抑制运算符。
我们想知道使用抑制运算符时的容错性。
我们了解到缓冲区用于存储events/aggregations直到window关闭。
现在让我们说重新平衡已经发生,并且活动任务被移动到不同的机器。我们想知道这个(内存中的?)缓冲区会发生什么。
假设我们正在跟踪用户的点击次数。我们将会话 window 的 in-activity 周期配置为 3 分钟,并且会话 window 已针对密钥 alice 启动,并且该密钥发生了 2 分钟的聚合。例如,在缓冲区中,我们有 (alice -> 5) 条目表示到目前为止,alice 在此会话中进行了 5 次点击。
然后说 alice 之后没有 activity。
如果一切正常,那么一旦会话结束,下游处理器将获得事件 alice -> 5。
但是如果现在有重新平衡,并且为 alice 维护会话 window 的活动任务被移动到新机器怎么办?
由于 alice 没有进一步的 activity,新机器上 运行 的下游处理器是否会错过这个事件 alice ->5 ?
抑制运算符提供与 Streams 中的任何其他状态存储类似的容错能力。尽管活动数据结构在内存中,但抑制缓冲区维护一个更改日志(一个内部 Kafka 主题)。
因此,当您进行重新平衡时,先前的活动任务会将其状态刷新到变更日志并丢弃内存缓冲区。新的活动任务通过重播变更日志主题重新创建状态,从而产生完全相同的缓冲内容,就好像没有重新平衡一样。
换句话说,就像内存中的状态存储一样,抑制缓冲区是持久的(在 Kafka 主题中),即使它不是持久的(在本地磁盘上)。
这有意义吗?
我们计划在 Session Windowed KTable 上使用抑制运算符。 我们想知道使用抑制运算符时的容错性。
我们了解到缓冲区用于存储events/aggregations直到window关闭。 现在让我们说重新平衡已经发生,并且活动任务被移动到不同的机器。我们想知道这个(内存中的?)缓冲区会发生什么。
假设我们正在跟踪用户的点击次数。我们将会话 window 的 in-activity 周期配置为 3 分钟,并且会话 window 已针对密钥 alice 启动,并且该密钥发生了 2 分钟的聚合。例如,在缓冲区中,我们有 (alice -> 5) 条目表示到目前为止,alice 在此会话中进行了 5 次点击。
然后说 alice 之后没有 activity。
如果一切正常,那么一旦会话结束,下游处理器将获得事件 alice -> 5。
但是如果现在有重新平衡,并且为 alice 维护会话 window 的活动任务被移动到新机器怎么办? 由于 alice 没有进一步的 activity,新机器上 运行 的下游处理器是否会错过这个事件 alice ->5 ?
抑制运算符提供与 Streams 中的任何其他状态存储类似的容错能力。尽管活动数据结构在内存中,但抑制缓冲区维护一个更改日志(一个内部 Kafka 主题)。
因此,当您进行重新平衡时,先前的活动任务会将其状态刷新到变更日志并丢弃内存缓冲区。新的活动任务通过重播变更日志主题重新创建状态,从而产生完全相同的缓冲内容,就好像没有重新平衡一样。
换句话说,就像内存中的状态存储一样,抑制缓冲区是持久的(在 Kafka 主题中),即使它不是持久的(在本地磁盘上)。
这有意义吗?