【问题标题】:Order of messages from multiple topics Kafka来自多个主题Kafka的消息顺序
【发布时间】:2017-06-15 12:27:29
【问题描述】:

我正在开发一个使用Apache Kafka 的软件。我有一个订阅了多个主题的消费者,我想知道是否有从这些主题接收消息的顺序。我在我的电脑上尝试了一些组合,但我需要确定这一点。 示例

  • 消费者子主题1和主题2
  • Producer1 在 topic1 上写一些东西
  • Producer2 在 topic2 上写一些东西
  • Producer1 在 topic1 上写一些东西
  • 当消费者轮询时,它会收到一个记录列表,其中首先包含来自他订阅的第一个主题的消息,然后是来自另一个主题的消息。

我想知道它是否总是这样,即消息按照我订阅的主题的顺序排列。 谢谢

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

【问题讨论】:

  • Kafka 代表一个无限的消息队列,你将如何定义你已经完成了来自 topic1 的所有消息的消费?

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


【解决方案1】:

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

关于两个主题的用例,主题的订阅顺序和消息顺序之间没有关系,因为即使集群有多个节点,主题分区领导者将在不同的代理上,客户端通过不同的代理接收消息连接。顺便说一句,即使只有一个具有所有主题/分区的代理,您也无法保证所描述的内容。

【讨论】:

  • 我认为答案总是一样的。如果您认为消息可以在两个主题中源源不断地出现,那么在消息进入主题 1 时从主题 2 获取消息的最佳时机应该是什么。在某种超时之后? (即,如果我想从 topic2 接收主题 1 中的 X 秒内没有消息)。
  • 我不知道,但我只需要确保每次进行投票时,我收到的列表首先包含来自第一个主题的记录,然后是来自其他主题的记录。如果没有关于topic1 或topic2 的消息则无所谓。我还没有看到背后的代码,但是当我使用列表订阅主题时,我想每次我进行投票时,他都会从 topic.get(0) 进行投票,然后从 topic.get(1) 等进行投票。 . 可能我错了,但是到目前为止我所做的所有测试,我总是从第一个主题收到,然后是第二个
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2018-10-27
      相关资源
      最近更新 更多