我正在学习 Apache-kafka,有一些困惑。请帮助我理解以下场景。
我的主题在 Kafka 集群中有 5 个分区和 5 个代理。我正在维护分区 1(例如 P1)中的消息顺序。我想将 P1 的消息广播给 10 个消费者。
所以我的问题是;这 10 个消费者如何与主题分区 p1 交互。
最佳答案
这可能不是您想要使用 Kafka 的方式。
除非您明确设置 key 的方式,否则您无法真正控制消息在生成主题时最终位于哪个分区。 Kafka 中的分区被设计得更像是低级管道,它是存在的,但您通常不需要与之交互。在消费者方面,将根据特定消费者组在任意时间有多少活跃消费者来为您分配分区。
解决这个问题的一种方法是定义一个主题只有一个分区,在这种情况下,所有消息当然都会发送到该分区。这并不理想,因为 Kafka 无法并行化数据摄取或服务,但这是可能的。
话虽如此,我们假设您确实设法将所有消息放入特定主题的分区 1 中。当您启动该主题的消费者组 ID 为 consumer1
的消费者时,它将被分配该主题的所有分区,因为该消费者是该主题的唯一 Activity 消费者该特定组 ID。如果该主题只有一个分区(如上所述),那么该消费者将获得所有数据。如果您随后使用相同的组 id 启动第二个消费者,Kafka 会注意到该特定组 id 有第二个消费者,但由于只有一个分区,它无法为其分配任何分区,因此该消费者永远不会获得任何数据。
另一方面,如果您使用不同的消费者组 ID 启动第三个消费者,例如 consumer2
,该 消费者现在将获取所有数据,并且它根本不会干扰 consumer1
消息消费,因为 Kafka 单独跟踪它们的消费偏移量。 Kafka 会跟踪每个分区上每个特定 ConsumerGroupId 的偏移量,因此如果其中一个开始缓慢消费或停止一段时间并在当天晚些时候重新开始消费,它不会感到困惑。
有关 Kafka 如何工作的更多详细信息,请参见:https://kafka.apache.org/documentation/#gettingStarted
有关如何使用 Kafka 消费者的更多信息,请访问此链接: https://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html
关于java - Apache Kafka 消息广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51702863/