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

纳兰清风 发布于 2015/09/01 20:11
阅读 26K+
收藏 1

场景:

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天了,谢谢!


加载中
0
纳兰清风
纳兰清风

尼玛,困扰我一年的问题今天终于知道答案了

同一个topic的同一个group下consumer进程只能有一个会收到消息,

但是这个进程内开多个线程(数量<=partition数)是可以实现并行接收消息的

下雨时候的我啊
回复 @纳兰清风 : 怎么解决的?
纳兰清风
纳兰清风
回复 @fushou : 解决了啊
f
fushou
请问解决了吗?
朱宝锋
多个消费者同时接收,和一个消费者多线程接收,是两个不同的概念吧
朱宝锋
应该是同一个topic 的一个parttiton消息,只能被consumergroup 的一个consumer 消费,如果 consumer大于partition的数量,则有一部分consumser 不能消费消息
0
c
changjq
当启动2个以上的消费者(group.id相同)时,只有一个消费者能收到信息,其他的都收不到。但是把能收到信息的那个消费者停掉之后,剩下的其中一个就也能收到了。(group.id相同) 也就是说你的几个消费者处于同一个群组,一个群组内只保证有一个消费者消费,不然不就重复消费了吗
纳兰清风
纳兰清风
当时搭着玩的,没再试过了,你也遇到了么?
ZuessYang
ZuessYang
回复 @纳兰清风 : 请问楼主这个问题解决了吗?
纳兰清风
纳兰清风
现在就是只有两个消费者,其中一个完全接不到消息,但是把另一个停掉后就能接到了
c
changjq
回复 @纳兰清风 : 一个消费群组中消费者个数配成<=partition个数试试呢
纳兰清风
纳兰清风
我的意思是所有的消息只发给一个消费者,而不是均衡的分发给多个消费者。这不是不对么?
0
atu250
atu250


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

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

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

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


0
l
liben2007
对,应该是消息都发到一个分区了,直接上服务器看下就知道了
0
zfg
zfg
group.id相同)同一个消费组内,一个消息只能被一个消费端接受(组内是队列模式),可以设置不同的组
0
H
HewangTian
partition对consumer是N:1的关系
0
********
********
同一个group内,consumer数量不能大于partition数,多出来的收不到消息
********
********
回复 @754267513 : 好吧
754267513
754267513
回复 @linzuk : 三个分区,两个消费者,怎么消费者就比分区多了,看清问题
纳兰清风
纳兰清风
回复 @linzuk : 这个原理我知道,问题中已经说明,partition是3,consumer是2
********
********
回复 @纳兰清风 : kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.
********
********
回复 @纳兰清风 : 算了,不想解释
下一页
0
ryanII
ryanII

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

纳兰清风
纳兰清风
用的是kafka-console-consumer.sh和kafka-console-producer.sh,根本没有设置key。
返回顶部
顶部