kafka 配置了多个消费者 只有一个消费者收到信息

发布于 2021-12-01 21:19:30 字数 507 浏览 966 评论 22

场景:

  • zookeeper 集群: 3 台服务器
  • kafka 集群:3 台服务器 broker.id:[0,1,2] num.partitions=2 正常启动没问题

一个生产者

  • topic 创建语句: sudo bin/kafka-topics.sh --zookeeper l-an15.wap.cn5:2181,l-an16.wap.cn5:2181,l-an5.wap.cn6:2181 --topic test3 --replication-factor=2 --partitions 3 --create

问题:当启动 2 个以上的消费者(group.id 相同)时,只有一个消费者能收到信息,其他的都收不到。但是把能收到信息的那个消费者停掉之后,剩下的其中一个就也能收到了。

感觉像是 partitions 始终等于 1 的情形,还是什么其他的原因,请各位支援一下,鼓捣 1 天了,谢谢!

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(22

平生欢 2021-12-08 12:56:49

这个原理我知道,问题中已经说明,partition 是 3,consumer 是 2

画骨成沙 2021-12-08 12:56:49

kafka 的设计原理决定,对于一个 topic,同一个 group 中不能有多于 partitions 个数的 consumer 同时消费,否则将意味着某些 consumer 将无法得到消息.

掩饰不了的爱 2021-12-08 12:56:49

回复
@纳兰清风 : 算了,不想解释

反目相谮 2021-12-08 12:56:49

这个问题我也遇到了,如果发送 topic 的时候设置的 key 是一样的,那么肯定会在一个分区里面,只有一个 consumer 能消费到,不设置 key 或者设置不同的 key 都会让消息发送到不同分区,多个 consumer 可以消费到,解决问题了请点赞

混吃等死 2021-12-08 12:56:47

回复
@754267513 : 好吧

累赘 2021-12-08 12:56:47

回复
@linzuk : 三个分区,两个消费者,怎么消费者就比分区多了,看清问题

醉生梦死 2021-12-08 12:56:42

同一个group内,consumer数量不能大于partition数,多出来的收不到消息

无边思念无边月 2021-12-08 12:56:33

partition对consumer是N:1的关系

累赘 2021-12-08 12:56:26


group.id相同)同一个消费组内,一个消息只能被一个消费端接受(组内是队列模式),可以设置不同的组

无边思念无边月 2021-12-08 12:55:41

对,应该是消息都发到一个分区了,直接上服务器看下就知道了

感情旳空白 2021-12-08 12:52:04

这是Kafka消息分区造成的,你可以去了解一下Kafka是如何分区的,就知道原因了。

问题原因可能是:你的所有消息的Key都是一样的,使用默认的Partitioner: hash(key)%numPartitions,这样每次的partion num都是一样的,所以数据都落到一个分区了。

而同一consumer grop并行消息,也是按照分区来分配的,因为只有一个分区上有数据,所以有一个consumer始终拿不到消息。

解决办法:1.自定义分区函数。2.消息散列为不同的key 

羁拥 2021-12-08 12:50:45

我的意思是所有的消息只发给一个消费者,而不是均衡的分发给多个消费者。这不是不对么?

为你鎻心 2021-12-08 12:40:44

回复
一个消费群组中消费者个数配成<=partition个数试试呢

归途 2021-12-08 12:31:58

现在就是只有两个消费者,其中一个完全接不到消息,但是把另一个停掉后就能接到了

明月松间行 2021-12-08 12:24:50

回复
请问楼主这个问题解决了吗?

英雄似剑 2021-12-08 11:07:26

当时搭着玩的,没再试过了,你也遇到了么?

三月梨花 2021-12-08 10:24:03

当启动2个以上的消费者(group.id相同)时,只有一个消费者能收到信息,其他的都收不到。但是把能收到信息的那个消费者停掉之后,剩下的其中一个就也能收到了。(group.id相同) 也就是说你的几个消费者处于同一个群组,一个群组内只保证有一个消费者消费,不然不就重复消费了吗

永不分离 2021-12-08 08:39:56

应该是同一个topic 的一个parttiton消息,只能被consumergroup 的一个consumer 消费,如果 consumer大于partition的数量,则有一部分consumser 不能消费消息

少女情怀诗 2021-12-08 02:51:56

多个消费者同时接收,和一个消费者多线程接收,是两个不同的概念吧

鹤舞 2021-12-08 00:46:02

请问解决了吗?

海之角 2021-12-05 02:50:05

回复
解决了啊

心舞飞扬 2021-12-03 12:02:29

回复
@纳兰清风 : 怎么解决的?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文