jafka icon indicating copy to clipboard operation
jafka copied to clipboard

不同组的Consumer订阅相同的一个或者多个topic问题

Open ywengineer opened this issue 8 years ago • 4 comments

一个zookeeper, 一个broker, Partition为1

不同组的Consumer订阅相同的一个或者多个topic, 只有一个组的Consumber会收到消息。请问这是什么原因呢?

ywengineer avatar May 05 '17 08:05 ywengineer

每一个partition在相同的groupId下同时只能被一个consumer消费,如果这个consumer挂了,其它consumer自动接管(在此之前是待命状态)。如果增加partition,那么其它consumer也会接管继续消费。 保证任何消息可被消费,同时却不会冲突。

如果有多个groupId,那么每个groupId之间的consumer并不冲突,各自消费,当前一个partition会被每一组groupId的一个消费。有多少groupId,那么这个partition就会被消费多少次。

adyliu avatar May 05 '17 08:05 adyliu

那对Consumer分组的意义又在哪里呢?

能留个IM么?

ywengineer avatar May 05 '17 08:05 ywengineer

上面原来没有写清楚,我重新更正了下上面的回答。QQ:四一零九43200

adyliu avatar May 05 '17 08:05 adyliu

以下是2个Consumer

1、不同组,消费同一topic,始终只有一个Cosumber能收到消息。另一个Consumer Group的FetchRunnable线程状态一直为Wait.

2、停掉一个Consumer Group,另一个Consumer Group的FetchRunnable线程状态一直为Wait.

3、不同Group消费不同topic也不行,另一个Consumer Group的FetchRunnable线程状态一直为Wait. 如果Consumer2的goupid与Consumer1相同,则可以消费不同的topic.

Consumer2: JafkaConsumer consumer2 = new JafkaConsumer("group-2", "101.37.19.118", 2181) { @Override protected void onMessage(JafkaMessage message) { System.out.println("consumer 2 onMessage => " + message.getData().readUTF()); } }; consumer2.addTopic("demo1").start();

Consumer1: JafkaConsumer consumer1 = new JafkaConsumer("group-1", "101.37.19.118", 2181) { @Override protected void onMessage(JafkaMessage message) { System.out.println("consumer 1 onMessage => " + message.getData().readUTF()); } }; consumer1.addTopic("demo1").start();

ywengineer avatar May 05 '17 09:05 ywengineer