【问题标题】:Is it possible to achieve at least once semantics using kafka in flink without using chekpoints?是否可以在不使用检查点的情况下在 flink 中使用 kafka 实现至少一次语义?
【发布时间】:2021-05-08 08:47:35
【问题描述】:

我想编写一个简单的 Flink 应用程序,它从 Kafka 队列中读取并处理消息并将输出存储到外部系统,至少具有一次语义并且不使用检查点。我想避免检查点,因为如果 Kafka 偏移量被检查点,那么所有中间状态也必须被检查点。换句话说,我希望应用程序尽可能无状态。

我设想的至少工作一次的方式如下:

  1. 从 kafka 读取的源
  2. 正在处理
  3. 输出存储到外部系统
  4. 消息已被 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 实现至少一次语义?

【问题讨论】:

    标签: apache-kafka apache-flink


    【解决方案1】:

    根据您已经链接的文档,它说:

    "Checkpointing disabled:如果 checkpointing 被禁用,Flink Kafka Consumer 依赖于内部使用的 Kafka 客户端的自动周期性偏移提交能力。因此,要禁用或启用偏移提交,只需设置 enable.auto.commit / auto .commit.interval.ms 键为提供的属性配置中的适当值。"

    由于您的目标是禁用检查点,您可以设置

    enable.auto.commit=true
    auto.commit.interval.ms=??? // use a time high enough such that your steps 2. and 3. are covered. 
    

    【讨论】:

    • 感谢您的回复@mike。我不认为这在所有情况下都至少保证一次(例如,如果 2. 和 3. 花费的时间比预期的要长怎么办),但这可能就足够了,因为应用程序通常有延迟要求,我们可以限制2. 和 3. 基于这些。
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 2018-07-18
    • 2012-04-21
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多