【发布时间】:2021-05-08 08:47:35
【问题描述】:
我想编写一个简单的 Flink 应用程序,它从 Kafka 队列中读取并处理消息并将输出存储到外部系统,至少具有一次语义并且不使用检查点。我想避免检查点,因为如果 Kafka 偏移量被检查点,那么所有中间状态也必须被检查点。换句话说,我希望应用程序尽可能无状态。
我设想的至少工作一次的方式如下:
- 从 kafka 读取的源
- 正在处理
- 输出存储到外部系统
- 消息已被 kafka 确认
注意:
- 如果 2. 或 3. 失败,应用重启,同样的消息会再次处理(好)
- 如果 2. 和 3. 成功,4. 失败并且应用重新启动,我们将存储两次结果(可接受)
基于https://ci.apache.org/projects/flink/flink-docs-stable/dev/connectors/kafka.html#kafka-consumers-offset-committing-behaviour-configuration,获得至少一次(或更强的一次)保证的唯一方法是使用检查点。
问题的核心似乎是 4. 需要与 1. 进行通信以确认 Kafka,这在标准 Flink 中无法发生,但使用有状态函数应该是可能的。
总而言之,问题是: 是否可以在不使用检查点的情况下在 flink 中使用 kafka 实现至少一次语义?
【问题讨论】: