kafka 配置了多个消费者 只有一个消费者收到信息
场景:
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(22)
这个原理我知道,问题中已经说明,partition 是 3,consumer 是 2
kafka 的设计原理决定,对于一个 topic,同一个 group 中不能有多于 partitions 个数的 consumer 同时消费,否则将意味着某些 consumer 将无法得到消息.
回复
@纳兰清风 : 算了,不想解释
这个问题我也遇到了,如果发送 topic 的时候设置的 key 是一样的,那么肯定会在一个分区里面,只有一个 consumer 能消费到,不设置 key 或者设置不同的 key 都会让消息发送到不同分区,多个 consumer 可以消费到,解决问题了请点赞
回复
@754267513 : 好吧
回复
@linzuk : 三个分区,两个消费者,怎么消费者就比分区多了,看清问题
同一个group内,consumer数量不能大于partition数,多出来的收不到消息
partition对consumer是N:1的关系
(
group.id相同)同一个消费组内,一个消息只能被一个消费端接受(组内是队列模式),可以设置不同的组
对,应该是消息都发到一个分区了,直接上服务器看下就知道了
这是Kafka消息分区造成的,你可以去了解一下Kafka是如何分区的,就知道原因了。
问题原因可能是:你的所有消息的Key都是一样的,使用默认的Partitioner: hash(key)%numPartitions,这样每次的partion num都是一样的,所以数据都落到一个分区了。
而同一consumer grop并行消息,也是按照分区来分配的,因为只有一个分区上有数据,所以有一个consumer始终拿不到消息。
解决办法:1.自定义分区函数。2.消息散列为不同的key
我的意思是所有的消息只发给一个消费者,而不是均衡的分发给多个消费者。这不是不对么?
回复
一个消费群组中消费者个数配成<=partition个数试试呢
现在就是只有两个消费者,其中一个完全接不到消息,但是把另一个停掉后就能接到了
回复
请问楼主这个问题解决了吗?
当时搭着玩的,没再试过了,你也遇到了么?
当启动2个以上的消费者(group.id相同)时,只有一个消费者能收到信息,其他的都收不到。但是把能收到信息的那个消费者停掉之后,剩下的其中一个就也能收到了。(group.id相同) 也就是说你的几个消费者处于同一个群组,一个群组内只保证有一个消费者消费,不然不就重复消费了吗
应该是同一个topic 的一个parttiton消息,只能被consumergroup 的一个consumer 消费,如果 consumer大于partition的数量,则有一部分consumser 不能消费消息
多个消费者同时接收,和一个消费者多线程接收,是两个不同的概念吧
请问解决了吗?
回复
解决了啊
回复
@纳兰清风 : 怎么解决的?