- Kafka消费者从属于消费者组,一个组里的消费者订阅的是同一个topic,每个消费者接收topic一部分分区的消息
- 可以为每一个需要获取一个或多个topic全部消息的应用程序创建一个消费者组,每个消费者可以消费若干个分区,往阻力添加消费者来伸缩读取能力和处理能力,组里的每个消费者只处理一部分消息
- 一个新的消费者加入消费者组时,它读取的事原本有其他消费者读取的消息
- 一个消费者被关闭或者发生崩溃时,他离开该组,原本由他读取的分区将由消费者组里的其他消费者读取
- 分区的所有权从一个消费者转移到另一个消费者,这个行为被称为再均衡。给消费者组带来了高可用性和伸缩性
- 消费者通过向被指派为群组协调器 的broker发送心跳来维持他们和组的从属关系以及他们对分区的所有权关系。只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,消费者会在轮询消息或提交偏移量时发送心跳。如果消费者停止发送心跳的时间足够长,会话就会过期,默认消费者死亡
核心参数指标
- fetch.min.bytes:消费者从服务器获取记录的最小字节数,如果可用的数据量小于指定大小,那么会等到有足够的可用数据时才把它返回给消费者,降低消费者和broker的工作负载
- fetch.max.wait.ms:指定borker的等待时间
- max.partition.fetch.bytes:服务器从每个分区里返回给消费者的最大字节数
- session.timeout.ms:消费者在被认为死亡之前可以与服务器断开连接的时间
- 设置过小:可以更快检测和恢复崩溃节点,长时间轮询或者垃圾手机可能导致非预期的再均衡
- 设置过大:减少意外的再均衡,检测节点崩溃需要更长的时间
- auto.offset.reset:消费者在读取一个没有偏移量的分区或者偏移量无效的情况下处理方式
- earliest:从起始位置读取分区记录
- latest:从最新的记录开始读取数据
- enable.auto.commit:消费者是否自动提交偏移量
- partition.assignment.strategy:分区的分配策略
- Range:把topic的若干个连续的分区分配给消费者
- RoundRobin:把topic的所有分区逐个分配给消费者
消费者如何提交偏移量
- 消费者往一个叫做_consumer_offset的特殊topic发送消息,消息里包含每个分区的偏移量
- 如果消费者崩溃或有新的消费者加入群组,就会触发再均衡,完成再均衡后,每个消费者可能分配到新的分区,而不是之前处理的额那个。为了能够继续之前的工作,消费者需要读取每个分区最后一次提交的偏移量,然后从偏移量指定的地方继续处理消息 。