首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Apache Kafka消息广播

Apache Kafka消息广播
EN

Stack Overflow用户
提问于 2018-08-06 15:48:48
回答 3查看 1.3K关注 0票数 0

我正在研究Apache-kafka,有一些困惑。请帮助我理解以下场景。

我有一个主题,在一个Kafka集群中有5个分区和5个代理。我在Partition 1(假设是P1 )中保持消息顺序,.I希望将P1的消息广播给10个消费者。

所以我的问题是:这10个消费者如何与主题分区p1交互。

EN

回答 3

Stack Overflow用户

发布于 2018-08-09 22:51:29

这可能不是你想要使用Kafka的方式。

除非您明确说明了如何设置键,否则在生成主题时,您无法真正控制消息最终位于哪个分区。Kafka中的分区被设计成更像低级管道,这是已经存在的东西,但你通常不需要与之交互。在消费者端,将根据某个特定消费者组在任何时候处于活动状态的消费者数量为您分配分区。

解决此问题的一种方法是将主题定义为只有一个分区,在这种情况下,所有消息都将转到该分区。这并不理想,因为Kafka将不能并行化数据摄取或服务,但它是可能的。

因此,话虽如此,让我们假设您确实设法将所有消息放在了特定主题的分区1中。当您启动该主题的消费者组id为consumer1的消费者时,它将被分配该主题的所有分区,因为该消费者是该特定组id的唯一活动分区。如果该主题只有一个分区,就像上面解释的那样,那么消费者将获得所有数据。如果您随后启动具有相同组id的第二个消费者,Kafka将注意到该特定组id有第二个消费者,但由于只有一个分区,它不能为其分配任何分区,因此该消费者永远不会获得任何数据。

另一方面,如果你使用不同的消费者组id启动第三个消费者,比如consumer2,该消费者现在将获得所有数据,并且完全不会干扰consumer1消息消费,因为Kafka会单独跟踪他们的消费偏移量。Kafka跟踪每个特定ConsumerGroupId在每个分区上的偏移量,因此如果其中一个开始缓慢消费或停止一段时间,并在当天晚些时候重新开始消费,它不会感到困惑。

更多关于卡夫卡如何工作的详细信息,请点击这里:https://kafka.apache.org/documentation/#gettingStarted

有关如何使用卡夫卡消费者的更多信息,请访问以下链接:https://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

票数 1
EN

Stack Overflow用户

发布于 2018-12-28 22:17:09

@mjuarez的答案是绝对正确的--为了简单起见,我会将其简化为以下内容;

不要试图只从单个分区读取数据,因为这是一个低级结构,这在某种程度上会破坏Kafka的并行性。如果你需要更好的数据分离,你最好创建更多的主题。

我还想补充说,大多数情况下,消费者不需要知道消息来自哪个分区,就像我不会根据消息来自哪个商店而不同地吃三明治一样。

票数 0
EN

Stack Overflow用户

发布于 2019-07-08 06:29:15

@mjuarez实际上是不正确的,我不确定为什么他的评论被操作员错误地证实了。您完全可以使用以下内容显式地告诉Kafka生产者记录属于哪个分区:

代码语言:javascript
运行
复制
ProducerRecord(
        java.lang.String topic,
        java.lang.Integer partition, // <--------- !!!
        java.lang.Long timestamp,
        K key,
        V value)

https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/ProducerRecord.html#ProducerRecord-java.lang.String-java.lang.Integer-java.lang.Long-K-V-

因此,在那之后说的大部分话都变得无关紧要了。

现在直接解决OP问题:您想要完成广播。要让一封邮件发送一次并多次阅读,您必须为每个读者提供不同的消费者组。

这个用例是一个绝对有效的Kafka使用范例。

你也可以使用RabbitMQ来完成这个任务:https://www.rabbitmq.com/tutorials/tutorial-three-java.html ...但这样做的方式并不理想,因为涉及多个进程外队列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51702863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档