生产者是怎么把数据给我们的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个分区

创建生产者一个副本 ,一个分区

  1. [root@zjj103 ~]# kafka-topics.sh --zookeeper zjj101:2181 --create --topic hello --partitions 1 --replication-factor 1
  2. Created topic "hello".

启动生产者

  1. [root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello

创建两个消费者
consumer.properties

  1. group.id=demogroup

两个消费者都是用zjj101机器,开两个shell终端操作的.
下面命令在两个shell终端分别输入一次

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties

生产者生产数据

  1. [root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello
  2. >aaa
  3. >bbb
  4. >ccc
  5. >ddd
  6. >eee
  7. >

消费者1接收数据

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
  2. aaa
  3. bbb
  4. ccc
  5. ddd
  6. eee

消费者2接收数据

  1. [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就管都不会管了.

  1. 具体consumer怎么分配消费哪个partiton,看下面:<br />[02.Kafka分区分配的概念,哪个consumer消费哪个partition](https://www.yuque.com/docs/share/c84aa587-51bc-442c-9bb2-ebc526567cee??inner=&view=doc_embed)

生产者2个分区

重新创建一个生产者,是2个分区的.,

  1. [root@zjj103 ~]# kafka-topics.sh --zookeeper zjj101:2181 --create --topic hello --partitions 2 --replication-factor 1
  2. Created topic "hello".

创建两个消费者
consumer.properties

  1. group.id=demogroup

两个消费者都是用zjj101机器,开两个shell终端操作的.
下面命令在两个shell终端分别输入一次

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties

生产者生产数据

  1. [root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 --topic hello
  2. >aaa
  3. >bbb
  4. >ccc
  5. >ddd
  6. >eee
  7. >

消费者1消费数据

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
  2. aaa
  3. ccc
  4. eee

消费者2消费数据

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
  2. bbb
  3. ddd

结论: 消费者接收数据被轮询了

发送一样的数据

生产者发送三条一样的数据

  1. [root@zjj103 ~]# kafka-console-producer.sh --broker-list zjj101:9092 topic hello
  2. >aaa
  3. >aaa
  4. >aaa

消费者1接收数据

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
  2. aaa
  3. aaa

消费者2接收数据

  1. [root@zjj101 ~]# kafka-console-consumer.sh --bootstrap-server zjj101:9092 --topic hello --consumer.config consumer.properties
  2. aaa

说明消息被轮询了.