在断电的情况下,我们可以丢失kafka消息吗?

时间:2016-09-21 15:35:21

标签: java apache-kafka kafka-consumer-api

我有一个关于Kafka过程失败的理论问题。 假设我们只有1个分区和2个消费者。我知道它不太可能有这样的情况,但它是例如我真的想要更好地理解它。我启用了自动提交和一点提交间隔。

分区是:

P: M1, M2, M3

其中M1,M2和M3是具有偏移(1,2,3)的消息。

假设以下内容:

T1: M1, M2 - failed
T2: M3

表示工作者(线程)1获得M1并成功处理它,但在处理M2时失败。例如,断电或某些硬件问题。但是在失败之前它已经提供了抵消2(顺便说一下 - 这可能吗?)。线程2获得M3,成功处理并承诺3的偏移量。

结果我们丢失了M2消息。 问题 - 这可能吗?如果问题很明显,请提前抱歉。

2 个答案:

答案 0 :(得分:3)

引自this优秀文章:

  

在开始讨论一致性和可用性之前,请继续   记住,只要你生产一个保证,这些保证就会保留   从一个分区分区和使用。 所有保证都已关闭   如果您使用两个消费者或同一个分区从同一个分区读取   使用两个生产者写入同一分区。

因此,对于两个消费者,您无法期望访问在处理过程中丢失的消息。但是,如果您坚持使用一个消费者并使用“至少一次消息传递”模式,那么:

  

至少   一旦交付,消费者从分区读取数据,处理   消息,然后提交它已处理的消息的偏移量。   我在这种情况下,消费者可能会在处理消息之间崩溃   并提交偏移量,当消费者重新启动它时   再次处理邮件。这会导致邮件重复   下游系统,但没有数据丢失。

答案 1 :(得分:1)

Kafka保证至少一次邮件传递。但你永远不会丢失信息。

你说过的情景永远不会发生。除非它读取消息,否则它不能提交偏移量。您已打开自动提交。这只是说你将为每个固定的时间间隔提交偏移量。这并不意味着偏移量将在不读取消息的情况下向前移动。卡夫卡保证。

http://kafka.apache.org/documentation.html#semantics