来自多个主题的消息顺序Kafka

时间:2017-06-15 12:27:30

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

我正在开发使用Apache Kafka的软件。我有一个订阅了多个主题的消费者,我想知道是否有接收来自这些主题的消息的订单。我在计算机上尝试了一些组合,但我需要确定这一点。 实施例

  • 使用子主题为topic1和topic2
  • Producer1在topic1上写了一些东西
  • Producer2在topic2上写了一些东西
  • Producer1在topic1上写了一些东西
  • 当消费者进行民意调查时,它会收到一个记录列表,其中首先包含他订阅的第一个主题的消息,然后是来自其他主题的消息。

我想知道它是否总是这样,即消息的顺序与我订阅的主题一样。 感谢

[编辑]我想指定我有两个主题,每个主题有一个分区,只有一个生产者和一个消费者。我需要首先阅读第一个主题的所有消息,然后阅读来自其他主题的消息

3 个答案:

答案 0 :(得分:2)

Kafka只为您提供在分区内订购消息的保证。这意味着即使只有一个主题但有多个分区,您也无法保证按照发送的顺序接收消息。

关于具有两个主题的用例,主题的订阅顺序与订阅消息之间没有关系,即使因为如果群集有多个节点,主题分区领导者将在不同的代理上,并且客户端会收到不同的消息连接。顺便说一句,即使只有一个经纪人拥有所有主题/分区,您也无法获得所描述的保证。

答案 1 :(得分:0)

没有。消息排序仅保留在分区中(甚至不在主题内)。

如果您需要更强的排序保证,则必须在应用程序中重新排列消息,例如使用时间戳(以及足够大的窗口缓冲区来捕获所有无序到达的消息)。最近Kafka本身为所有消息添加了时间戳,对此的支持有所改善,但原则仍然相同。

答案 2 :(得分:0)

为什么不首先订阅第一个主题并进行投票,然后订阅另一个主题并进行另一次投票?如果没有这个,我不认为您可以保证从这两个主题接收消息的顺序。