Kafka-consumer(消费者)

kafka的消费者叫做consumer,不应该把它理解成消息的接收者,这与rabbit mq不一样,因为kafka的consumer是主动去kafka代理服务器(broker)去拉自己想要的消息的,而不是服务器推送过来的,下图是consumer与partition的关系

在这里插入图片描述
从图中可以看出左下角还有一个partition,这是kafka自带的partition,专门用来存放主题为_consumer_offset的消息,下面开始叙述上图中的过程
1.消费者c1从p1中消费index=0的消息,消息内容是“我”
2.消费者c1获取到该消息之后,c1身份切换,从消费者,变成发送者
3.消费者c1(此时做为发送者)向主题_consumer_offset发送一条消息,消息的内容是key=c1_T1_p1,其实就是消费者id+主题+分区id,value=0
4.图中左下角的partition接到c1发送的消息之后,持久化到本地,其内容的含义是:消费者c1从分区p1中消费主题T1的消息,已经消费到了index=0的位置

目的是当c1宕机,重启之后,还能继续从它应该消费的位置消费

那么了解了上述之后,当c1去p2消费一条消息的时候,图是下面这样的
在这里插入图片描述
其中黄色圆圈里的内容,就是消费完p2的消息之后,对c1和p2消费关系的一个映射

好了,消费者与partition之间的关系就介绍完毕,但是本文只演示了一个消费者,多个消费者的情况是一样的,只是kafka有消费组这个概念

消费组
消费组是为了解决重复消费而引入的概念,只要是分布式中间件,都需要解决重复消费的问题
如果多个消费者属于同一个消费组,那么同一个消费组中,只能有一个消费者从某个partition中消费消息,下面是一个简单的示意图
在这里插入图片描述
当consumer1从第一条数据开始消费的时候,那么和它同一个组的consumer2,将永远没有机会消费

顺序消费: 根据上述特性,我们可知,要想顺序消费,一个consumer,只能消费一个partition,且一个主题的消息,只能往一个partition中推消息,也就是说,将kafka用成rabbit mq的样子,一般情况使用kafka是不会用到顺序消费的,除非作为面试题用用而已,因为kafka的业务场景和设计理念,就注定了它应该作为高吞吐量的数据分析用,而不是高保证消息丢失不丢是的中间件

消息回溯消费
1.可以从头消费
2.也可以从指定的offset消费
3.可以从指定的时间点消费(本质也是找到指定时间点的offset)
上述三种的命令和java api以后再补,因为我个人觉得,重要的是知识面,而不是那些命令或者api,知识面广了,很多东西你自然而然就知道该怎么做,查阅资料很简单,但是如果知识面不足,那么查资料都不知道从何开始

消费者auto commit
auto_commit_interval_ms参数:自动提交间隔时间,比方设置100毫秒,如果100毫秒内消费了50条数据,那么offset就会增加50

两个索引文件
和commit log文件同文件夹有两个index文件,一个是索引查找,一个是time index,配合这俩index定位到commit log文件的大概位置(二分查找),然后再顺序IO查找

重平衡(Rebalance)
kafka的Rebalance指的是,同一个组的多个消费者,均衡的消费多个partition,比方说有10个partition,5个consumer,那么应该每个consumer,消费两个partition,这样达到均衡消费,假设突然有一个consumer宕机了,那么多出来两个partition,这两个多出来的partition将如何处理,这就是Rebalance

heartbeat_interval参数:consumer和broker的心跳时间
session_timeout参数:如果多久没收到心跳,broker就会踢掉consumer

Rebalance机制由broker leader触发,就是多个broker中的leader,也叫总控制器controller,kafka的broker启动的时候,假设是好几个一起启动的,它们都会往zk中创建一个叫controller的节点,并写节点数据,因为zk是原子操作,所以谁最先写成功,谁就是总控制器controller

Rebalance有三种策略
1.range:就是根据一种算法,但是我觉得这个算法不是很重要,假设n=分区数/消费者数,假设m=分区数%消费者数,前m个消费者每个分配n+1个分区,剩下的消费者每个分配n个分区
假设12345个分区,c1c2两个消费者,则c1分到123,c2分到45
日记:我觉得采用hash不是更好么?
2.round-robin:轮询分配,类似斗地主发牌,将第1个分区给第1个消费者,第2个分区给第2个消费者,依次类推
日记:这个方式与range方式得到的分区数量是相同的,不同的地方在于分区顺序不一样,既然数量相同,不同的Rebalance策略那有什么意义?
3.sticky:能不动就不动的原则,假设原来有p1p2p3,三个分区,分别在c1c2c3上,现在c3宕机了,那么p1依然在c1上,p2依然在c2上,将p3分配给c1

努力攒钱,只为睡到马银霜


猜你喜欢

转载自blog.csdn.net/u011624903/article/details/113487804