多消费者的 Kafka 消息至少一次模式
Kafka Message at-least-once mode at multi-consumer
Kafka 消息传递使用至少一次消息传递来确保每条消息都得到处理,并使用消息偏移量来指示下一个要传递的消息。
当有多个消费者时,如果某些deadly消息在消息处理过程中导致消费者崩溃,这个消息是否会被重新投递给其他消费者并传播死亡?如果一些slow消息阻塞了一个消费者,其他消费者是否可以继续处理后续消息?
或者更糟糕的是,如果一条缓慢而致命的消息导致消费者崩溃,是否会导致其他消费者再次从其偏移量开始?
这里有几点需要考虑:
- 一个Kafka主题分区一次只能被一个消费者组中的一个消费者消费。所以如果两个消费者属于两个不同的组,他们可以同时从同一个分区消费。
- 存储的偏移量是每个消费者组。因此,每个主题分区都为每个活跃(或最近活跃)的消费者组存储了一个偏移量,消费者订阅了该分区。
- 偏移量可以按特定时间间隔自动提交,或手动提交(由消费者应用程序)。
那么让我们看看你描述的场景。
- 某些致命消息导致消费者在消息处理期间崩溃
- 如果偏移量是自动提交的,那么当消息处理失败并使消费者崩溃时,偏移量已经提交并且接管的组中的下一个消费者将不再看到该消息。
- 如果在处理完成后手动提交偏移量,则不会提交该消息的偏移量(为简单起见,我假设一次读取和处理一条消息,但这很容易概括)因为消费者崩溃的原因。因此,组中(将)订阅该主题的任何其他消费者将在接管该分区后再次阅读该消息。因此,它也有可能使其他消费者崩溃。如果在消息处理之前提交偏移量,那么下一个消费者将看不到该消息,因为当第一个消费者崩溃时偏移量已经提交。
- 一些慢消息会阻塞单个消费者:只要消费者被认为是存活的,组中的其他消费者就不会接管。如果缓慢超过消费者的
session.timeout.ms
消费者将被视为死亡并从组中移除。因此,该组中的另一个消费者是否会阅读该消息取决于 how/when 偏移量是否已提交。
- 缓慢而致命的消息导致消费者崩溃:这种情况在Kafka的处理方式上应该与之前的情况类似。要么首先检测到速度缓慢,要么首先发生崩溃。同样重要的是 how/when 偏移量已提交。
希望对您的问题有所帮助。
Kafka 消息传递使用至少一次消息传递来确保每条消息都得到处理,并使用消息偏移量来指示下一个要传递的消息。
当有多个消费者时,如果某些deadly消息在消息处理过程中导致消费者崩溃,这个消息是否会被重新投递给其他消费者并传播死亡?如果一些slow消息阻塞了一个消费者,其他消费者是否可以继续处理后续消息? 或者更糟糕的是,如果一条缓慢而致命的消息导致消费者崩溃,是否会导致其他消费者再次从其偏移量开始?
这里有几点需要考虑:
- 一个Kafka主题分区一次只能被一个消费者组中的一个消费者消费。所以如果两个消费者属于两个不同的组,他们可以同时从同一个分区消费。
- 存储的偏移量是每个消费者组。因此,每个主题分区都为每个活跃(或最近活跃)的消费者组存储了一个偏移量,消费者订阅了该分区。
- 偏移量可以按特定时间间隔自动提交,或手动提交(由消费者应用程序)。
那么让我们看看你描述的场景。
- 某些致命消息导致消费者在消息处理期间崩溃
- 如果偏移量是自动提交的,那么当消息处理失败并使消费者崩溃时,偏移量已经提交并且接管的组中的下一个消费者将不再看到该消息。
- 如果在处理完成后手动提交偏移量,则不会提交该消息的偏移量(为简单起见,我假设一次读取和处理一条消息,但这很容易概括)因为消费者崩溃的原因。因此,组中(将)订阅该主题的任何其他消费者将在接管该分区后再次阅读该消息。因此,它也有可能使其他消费者崩溃。如果在消息处理之前提交偏移量,那么下一个消费者将看不到该消息,因为当第一个消费者崩溃时偏移量已经提交。
- 一些慢消息会阻塞单个消费者:只要消费者被认为是存活的,组中的其他消费者就不会接管。如果缓慢超过消费者的
session.timeout.ms
消费者将被视为死亡并从组中移除。因此,该组中的另一个消费者是否会阅读该消息取决于 how/when 偏移量是否已提交。 - 缓慢而致命的消息导致消费者崩溃:这种情况在Kafka的处理方式上应该与之前的情况类似。要么首先检测到速度缓慢,要么首先发生崩溃。同样重要的是 how/when 偏移量已提交。
希望对您的问题有所帮助。