Kafka在多消费者处消息至少一次模式

时间:2017-09-22 02:39:45

标签: apache-kafka message-queue kafka-consumer-api

Kafka消息传递使用至少一次消息传递来确保每条消息都得到处理,并使用消息偏移量来指示下一条消息将被传递。

当有多个消费者时,如果某些致命消息在消息处理过程中导致消费者崩溃,此消息是否会重新传递给其他消费者并传播死亡?如果某个消息阻止了单个消费者,其他消费者是否可以继续处理并处理后续消息? 或者更糟糕的是,如果慢而致命的消息导致消费者崩溃,是否会导致其他消费者再次从其偏移开始?

1 个答案:

答案 0 :(得分:2)

这里有几点需要考虑:

  1. Kafka主题分区一次可由消费者组中的一个消费者使用。因此,如果两个消费者属于两个不同的组,他们可以同时使用同一个分区。
  2. 存储的偏移量是按消费者群体划分的。因此,每个主题分区都有一个存储的偏移量,用于每个活动(或最近活动)的消费者组,其中消费者订阅了该分区。
  3. 偏移量可以按特定间隔自动提交,也可以手动提交(由消费者应用程序提供)。
  4. 所以,让我们来看看你描述的情景。

    • 某些致命消息会导致消息处理期间消费者崩溃
      • 如果自动提交偏移量,则可能在消息处理失败并使消费者崩溃时,偏移量已经提交,并且接管的组中的下一个消费者将不再看到该消息。
      • 如果在处理完成后手动提交偏移量,则不会提交该消息的偏移量(为简单起见,我假设一次读取并处理一条消息,但这很容易推广)因为消费者崩溃。因此,在(将)订阅该主题的组中的任何其他消费者将在接管该分区之后再次阅读该消息。因此,它可能会使其他消费者崩溃。如果在消息处理之前提交了偏移量,那么下一个消费者将不会看到该消息,因为当第一个消费者崩溃时已经提交了偏移量。
    • 一些慢速消息阻止单个消费者:只要消费者被认为是活着的,该组中的其他消费者就不会接管。如果缓慢超出消费者session.timeout.ms,消费者将被视为死亡并从组中移除。因此,该组中的另一个消费者是否会读取该消息取决于提交偏移量的方式/时间。
    • 缓慢且致命的消息导致消费者崩溃:就Kafka如何处理消息而言,此场景应与之前的场景类似。首先检测慢度或首先发生崩溃。同样重要的是如何/何时提交偏移量。

    我希望这有助于解决您的问题。