【问题标题】:How to guarantee that messages in Kafka not lost if service crashed如果服务崩溃,如何保证 Kafka 中的消息不会丢失
【发布时间】:2020-05-18 19:49:19
【问题描述】:

我们服务组中客户端的所有配置中的第一个是enable.auto.commit = falseauto.offset.reset = earliest,以确保未处理的消息不会被提交。

现在我想了解如何保证消息不会丢失,例如服务崩溃。 我要确保的是以下情况:

  1. 接收到偏移量为 1 的消息 A - 服务开始处理消息(异步)
  2. 收到偏移量为 2 的消息 B - 服务开始处理消息(异步)
  3. 消息 B 的处理已完成,偏移量 2 已提交给 Kafka。
  4. 在完成消息 A 的处理并提交偏移量 1 之前,服务会重新启动。
  5. 服务再次启动并处理来自偏移量 1 的消息,因为它尚未提交。

如果我理解正确,那么当服务再次启动时,它将接收从偏移量 3 开始的消息,并且偏移量 1 中的消息将丢失,对吗?

如果我是对的,我可以通过配置修复它还是需要对提交的偏移量进行某种管理?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    对于消费者,除非他们生产回kafka,否则kafka最多支持at-least-once语义,这是您的情况,并且您想实现exactly-once语义,据我所知。

    再次,如果您不使用处理器逻辑 Kafka 到 Kafka (consume process produce from and to Kafka) ,您有两种选择来实现恰好一次:

    • 您可以使用幂等消费者处理由at-least-once 传递语义引起的重复。
    • 如果我们的目标系统不是 Kafka 但具有事务支持,您可以像 Kafka 在 Kafka 到 Kafka 的事务中那样解决这个问题,通过原子更新目标并将偏移量存储为事务的一部分。

    还值得一提的是,根据您的用例,您可能会发现 connector 已经解决了您的问题。

    这些阅读可以帮助您更好地了解您的问题和可能的解决方案:

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2018-08-26
      • 2019-08-16
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2019-08-16
      • 2018-12-04
      • 2023-03-14
      相关资源
      最近更新 更多