目录
消费者和消费组
Kafk的消费者从属于消费群组,一个群组里面的消费者订阅的是同一个主题。每个消费者接受主题的一部分分区消息。关系如下:
消费者群组和分区再均衡
(1)什么是分区再均衡?
分区的所有权从一个消费者转移到另一个消费者,叫做分区再均衡。
(2)什么情况下会导致分区再均衡?
a.一个新的消费者加入群组时,它读取的是原本其他消费者读取的消息
b.当一个消费者关闭或者发生崩溃时,会离开群组,此时原本又它读取的分区将有群组中其他的消费者读取
c.在主题发生变化时,比如添加了新的分区
(3)发生分区再均衡的影响?
再均衡期间,消费者无法读取消息,造成整个群组一小段时间的不可用。并且当分区被从新分配给另一个消费者时,消费者当前的读取状态丢失。
(4)消费者通过向被指派为群组协调器的broker发送心跳来维持他们和群组的从属关系以及他们对分区的所有权关系。只有消费者在正常时间间隔内发送了心跳,就被认为是活跃的。如果消费者停止发送心跳的时间足够长,会话就会过期,群组协调器会认为该消费者已经死亡,触发一次再均衡。
(5)如何进行分配分区?
当有消费者加入到群组,会先向群组协调器发送一个JoinGroup的请求,第一个加入群组的消费者会成功”群主“。群主会从协调器获取到群组的成员信息(包括所有最近发送过心跳的消费者)并负责给每一个消费者分配分区。
消费者的相关配置
(1)fetch.min.bytes:指定了消费者从服务器获取记录的最小字节数。broker在收到消费者的数据请求时,如果可用数据量小于该值,那么broker会等到有足够多的数据量时再返回给消费者。
(2)fetch.max.wait.ms:用于指定broker的等待时间。默认500ms。如果么有足够的数据流入kafka,消费者获取最小数据量的要求无法满足,最终达到500ms的延迟,会将此时topic小于fetch.min.bytes的数据量返回给消费者。
(3)max.partiton.fetch.bytes:指定服务器从每个分区中返回给消费者的最大字节数。默认值1M,也就是KafkaConsumer.poll()方法从每个分区里返回的记录最多不能超过该值。在实际分配消费者内存时,需要多分配一些,需要防止有的消费者挂掉,其他消费者需要处理更多的分区。
(4)session.timeout.ms:指定消费者在被认为死亡之前可以与服务器断开连接的时间,默认是3s。也就是3s之内没有发送心跳检测,就会被认为已死亡,协调器会再均衡。该参数与heartbeat.interval.ms相关。heartbeat.interval.ms指定了发送心跳的频率。所以heartbeat.interval.ms要比session.timeout.ms小。一般是session.timeout.ms的三分之一。
(5)auto.offset.reset:消费者在