生产者是怎么把数据给我们的partition的
Kafka 的topic和消费者组里面的消费者消费的关系.
1.一个topic一个partition只能被一个消费者组里面一个消费者消费
如果这个消费者组里面有两个消费者的话,会有一个消费者因为没有抢到partition而闲置着. 也就是说,一个partition在消费组里面最多只能有一个消费者消费.
2.一个topic一个partition可以被不同的消费者组里面的消费者消费
如果你有两个消费者组消费一个partition里面的值, 假如说partition里面有100条数据
结果就是 这两个消费者组里面的其中一个抢到partition的消费者分别消费100条数据
也就是说, 假如,生产者发送了 一个消息 ,消息为hello,. 那么 两个消费者组里面的其中一个抢到partition的消费者都会消费这个 hello 的消息.
3.一个topic下两个partition被同一个消费者组里面两个消费者分摊消费
两个消费者分别获取到两个partition的消费权.就是 partition1被consumer1 消费, partiton2被consumer2消费.
4.一个topic下两个partiton被同一个消费者组里面三个消费者消费,会有一个消费者因为没有抢到partition消费权而歇着待机不工作
假如说 partition1被consumer1消费, partition2被consumer2消费, 那么剩下的consumer3因为没有抢到partition,就只能歇着不工作. 因为partition只能被同一个消费者组里面的一个消费者消费.
创建生产者1个分区
创建生产者一个副本 ,一个分区
[root@zjj103 ~]# kafka-topics.sh --zookeeper zjj101:2181 --create --topic hello --partitions 1 --replication-factor 1
Created topic "hello".
启动生产者
[root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello
创建两个消费者
consumer.properties
group.id=demogroup
两个消费者都是用zjj101机器,开两个shell终端操作的.
下面命令在两个shell终端分别输入一次
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
生产者生产数据
[root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello
>aaa
>bbb
>ccc
>ddd
>eee
>
消费者1接收数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
aaa
bbb
ccc
ddd
eee
消费者2接收数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
结果:**
消费者1接收到了5条数据, 消费者2一条数据没接收到.
结论 同一时刻只有一个消费者接收到消息。 另外一个消费者分不到partition消费就空着待机了.
因为启动consumer的时候,consumer会通过某种算法分配消费哪个partition, 分配完了之后这个consumer就一直消费这个partition的数据了.别的分区这个consumer就管都不会管了.
具体consumer怎么分配消费哪个partiton,看下面:<br />[02.Kafka分区分配的概念,哪个consumer消费哪个partition](https://www.yuque.com/docs/share/c84aa587-51bc-442c-9bb2-ebc526567cee??inner=&view=doc_embed)
生产者2个分区
重新创建一个生产者,是2个分区的.,
[root@zjj103 ~]# kafka-topics.sh --zookeeper zjj101:2181 --create --topic hello --partitions 2 --replication-factor 1
Created topic "hello".
创建两个消费者
consumer.properties
group.id=demogroup
两个消费者都是用zjj101机器,开两个shell终端操作的.
下面命令在两个shell终端分别输入一次
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
生产者生产数据
[root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello
>aaa
>bbb
>ccc
>ddd
>eee
>
消费者1消费数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
aaa
ccc
eee
消费者2消费数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
bbb
ddd
结论: 消费者接收数据被轮询了
发送一样的数据
生产者发送三条一样的数据
[root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 topic hello
>aaa
>aaa
>aaa
消费者1接收数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
aaa
aaa
消费者2接收数据
[root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
aaa
说明消息被轮询了.