我正在构建一个 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
到达才能运行处理并将输出事件推送到输出主题。
实现相当简单——key by session_key
, store start_event
into ValueState
, entries into ListState
, 然后在end_event
到达时对所有事件运行处理逻辑并将结果推送到输出 Kafka 主题中。
我的问题是关于检查点和可能的失败——假设检查点是在end_event
离开 Kafka 之后开始的。偏移量已提交给 Kafka,检查点屏障到达我的处理操作员,该操作员在它之前失败(Kafka 现在已关闭)。
我应该如何正确地从中恢复?如果 Kafka 偏移量已经提交,并且没有end_event
人会因此而脱离 Kafka,那么session_key
以后如何触发处理操作符以获取我保存的状态?或者在这种情况下不会提交 Kafka 偏移量并且end_event
会再次通过 Flink?