Apache Kafka交付订单

时间:2017-01-16 12:55:45

标签: apache-kafka kafka-consumer-api

假设我有一个Kafka制作人。

我的消费者首先将消息M1写入Kafka上的主题T1(通过sync api),然后将消息M2写入主题T2。

那时消费者正在倾听话题T1和T2。每当它在主题T2上看到消息时,它就会在主题T1上查找相关消息。

是否保证每当消费者在主题T2上看到消息M2时,它将在主题T1上看到消息M1? (因为M1是在M2之前写的)

4 个答案:

答案 0 :(得分:2)

关于担保的Kafka doc

https://kafka.apache.org/documentation/#intro_guarantees

  • 在高级别Kafka提供以下保证:

  • 生产者发送到特定主题分区的消息将按照发送顺序附加。也就是说,如果记录M1由同一生产者作为记录M2发送,并且首先发送M1,那么M1将具有比M2更低的偏移量并且在日志中出现得更早。

  • 使用者实例按照它们存储在日志中的顺序查看记录。 对于具有复制因子N的主题,我们将容忍最多N-1个服务器故障,而不会丢失任何提交到日志的记录。

答案 1 :(得分:2)

不,不能保证

Kafka消费者无法根据流量阅读您主题的最新消息。 在高峰时期,您的消费者完全有可能在几分钟前就特定主题阅读消息,并在另一个主题上更新消息。

此外,它意味着一些严肃的调整,以确保您可以正确分发您的应用程序,关于分区的做法。

使用kafka消费者重新分区的默认行为,您将无法拥有多个消费者,从而消除了重要的Kafka优势,即水平可扩展性。

答案 2 :(得分:1)

不确定你是否想问你的问题。

是的,保证消费者最终会看到M1和M2。

保证在看到M2之前会看到M1 。完全允许它看到M2然后才接收M1,任意长时间之后。任意长,我们谈的是毫秒,而不是几天。

答案 3 :(得分:1)

  

是否保证每当消费者在主题T2上看到消息M2时,它将在主题T1上看到消息M1? (因为M1是在M2之前写的)

不,这不能保证。

Kafka不保证跨主题订阅消息。有关记录,请参阅Apache Kafka文档中的Guarantees,了解确切的内容。

在您的情况下,您确实有跨主题的消息(消息M1位于主题T1中,消息M2位于主题T2中),因此&#39 ;不保证何时相对于彼此,将会读取/消费消息M1M2

此外,当最终正在读取这两条消息时, time (或时间增量)无法保证 - 它们都可以在毫秒的时间间隔内读取,或者秒等等(实际上,消息通常会很快消耗掉。)