正确发送 Flink 状态到 Kafka

Correctly sending Flink state to Kafka

我正在构建一个 Kafka -> Flink -> Kafka 管道,它与描述的“会话”数据一起使用。我输入的 Kafka 主题具有以下格式的数据,并构成 session_key:

的一个会话
start_event(session_key, some_other_data...)
entry_event(session_key, some_other_data...)
entry_event(session_key, some_other_data...)
...
entry_event(session_key, some_other_data...)
end_event(session_key, some_other_data...)

像这样的每个会话大约有 100 个事件,发生得很快(每 1-2 秒),所有事件共享相同的 session_key,我正在将会话转换为一系列 20 或所以进入输出主题的事件。要构建这些事件,我需要了解整个会话,因此我需要等待 end_event 到达才能 运行 处理并将输出事件推送到输出主题。

实现相当简单 - 通过 session_key 键,将 start_event 存储到 ValueState,将条目存储到 ListState,然后当 end_event 到达时, 运行 所有事件的处理逻辑并将结果推送到输出 Kafka 主题。

我的问题是关于检查点和可能的故障 - 假设检查点在 end_event 离开 Kafka 之后开始。偏移量提交给 Kafka,检查点屏障到达我的处理运算符,它在它之前失败(Kafka 现在已关闭)。

我应该如何正确地从中恢复?如果 Kafka 偏移量已经提交,并且 end_event 永远不会为那个 session_key 从 Kafka 中取出它,我以后如何为我保存的状态触发处理运算符?或者在这种情况下不会提交 Kafka 偏移量并且 end_event 将再次通过 Flink?

我认为kafka offset不会在这个场景下提交,offset是在checkpoint的notify阶段提交的

仅当所有操作员的检查点都成功时才会触发通知阶段。

Flink 仅出于监控目的提交 Kafka 偏移量,但不依赖它们进行容错(顺便说一句,它会在检查点完成时执行):

Note that Kafka source does NOT rely on committed offsets for fault tolerance. Committing offset is only for exposing the progress of consumer and consuming group for monitoring.

参见Consumer Offset Committing

主题偏移量在检查点期间保存为 Kafka 源状态的一部分。在所描述的场景中,整个检查点将失败,Flink 将从前一个检查点中保存的偏移量开始消费主题。不会丢失任何消息,但有些消息可能会被复制(假设 AT_LEAST_ONCE 检查点模式)。

所以是的,end_event 将再次通过 Flink。