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

Kafka Message at-least-once mode at multi-consumer

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

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

这里有几点需要考虑:

  1. 一个Kafka主题分区一次只能被一个消费者组中的一个消费者消费。所以如果两个消费者属于两个不同的组,他们可以同时从同一个分区消费。
  2. 存储的偏移量是每个消费者组。因此,每个主题分区都为每个活跃(或最近活跃)的消费者组存储了一个偏移量,消费者订阅了该分区。
  3. 偏移量可以按特定时间间隔自动提交,或手动提交(由消费者应用程序)。

那么让我们看看你描述的场景。

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

希望对您的问题有所帮助。