生产者&消费者实战
1、创建一个topic (名字为first1,并设置一个副本,一个分区)
kafka-topics.sh \--create \--zookeeper shouhou153:2181,shouhou155:2181,shouhou156:2181 \--replication-factor 1 \--partitions 1 \--topic first
2、启动producer和两个consumer
生产者
kafka-console-producer.sh \--broker-list shouhou153:9092 \--topic first1
消费者
kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic first1
可以看到两个消费者都可以消费到同一个topic里的数据
消费时可以加 --from-beginning 作用是的作用是使consumer从kafka最早的消息开始消费
这时我将两个consumer关闭掉,在起一个,加上–from-beginning参数
kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic first1 \--from-beginning
可以看到会从该topic最早的消息开始消费
通过kafka的监控页面查看
topic:创建时topic名称
partition:分区编号
offset:表示该parition已经消费了多少条message
logSize:表示该partition已经写了多少条message
Lag:表示有多少条message没有被消费。
Owner:表示消费者
Created:该partition创建时间
Last Seen:消费状态刷新最新时间。
点击first1可以查看该Consumer当前的消费状况
这张图片的左上角显示了当前Topic的生产速率,右上角显示了当前Consumer的消费速率。
图片中还有三种颜色的线条,蓝色的表示当前Topic中的Message数目,灰色的表示当前Consumer消费的offset位置,红色的表示蓝色灰色的差值,即当前Consumer滞后于Producer的message数目。
参考:链接
3、消费者组
1. 一个消费者只能属于一个消费者组
2. kafka同一个gruopid下多个consumer订阅同一个topic,只有一个consumer能消费到数据(前提是只有一个分区)
3. 不同消费者组中的消费者可以消费同一个topic
案例: 创建一个topic名为test,并设置一个partition, 启动两个consumer同时订阅topic “test” ;groupid都为test1;producter向test发送10条数据,结果全部数据都被一个consumer接收到了,另外一个consumer没有接受到任何数据;
原因:如果topic存到了几个partitions里面,那么一个partitions只会被一个consumer消费(为了保证消息的顺序),如果test的partitions数量为1 ,那么只会有一个consumer能消费
一、消费者的数量大于分区的数量
1、创建一个名为test的topic,并指定一个分区
./kafka-topics.sh \--create \--zookeeper shouhou153:2181 \--replication-factor 2 \--partitions 1 \--topic mytest
2、创建生产者向mytest生产数据
./kafka-console-producer.sh \--broker-list shouhou153:9092 \--topic mytest
3、创建两个消费者,并指定同一个groupid (group.id=group_mytest)
bin/kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic mytest \--consumer-property group.id=group_mytest
此时分区数是1,消费者是2,消费者的数据大于分区的数量
使用生产者生产数据,可以得到两个消费者消费数据的情况,如下:
这说明:同一个分区内的消息只能被同一个组中的一个消费者消费,当消费者数量多于分区数量时,多于的消费者空闲(不能消费数据)。
二、消费者少于和等于分区数
1、创建一个三分区的topic mytest2
./kafka-topics.sh \--create \--zookeeper shouhou153:2181 \--replication-factor 1 \--partitions 3 \--topic mytest2
2、在刚刚的group中启动两个消费者,查看消费情况
./kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic mytest2 \--consumer-property group.id=group_mytest
这说明:当分区数多于消费者数的时候,同一个组内有的消费者对应多个分区
3、启动三个消费者,再次查看消费情况
可以看到,生产的数据被均匀的分配到了三个消费者上。这说明:当分区数等于消费者数的时候,每个消费者对应一个分区。
三、多个消费者组
再创建一个新的消费者组 group.id=group_mytest2,使用两个消费者组对mytest进行消费
窗口1生产者:./kafka-console-producer.sh \--broker-list shouhou153:9092 \--topic mytest
窗口二消费者组1:./kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic mytest \--consumer-property group.id=group_mytest
窗口三消费者组2:./kafka-console-consumer.sh \--bootstrap-server shouhou153:9092 \--topic mytest \--consumer-property group.id=group_mytest2
从上图看一看到,生产者生产的数据,两个在、消费组都可以消费的到,这说明启动多个组,相同的数据会被不同组的消费者消费多次。
参考:链接