消费者
消费者和消费者组
Kafka消费者从属于消费者群组。一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息。
- 消费者组1和消费者组2可以同时消费所有消息,互不影响。
再平衡:
分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。
消费者通过向被指派为群组协调器的broker(不同的群组可以有不同的协调器)发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系。只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,说明它还在读取分区里的消息。
消费者相关配置:
-
fetch.min.bytes:
该属性指定了消费者从服务器获取记录的最小字节数
-
fetch.max.wait.ms:
我们通过fetch.min.bytes告诉Kafka,等到有足够的数据时才把它返回给消费者。而feth. max.wait.ms则用于指定broker的等待时间,默认是500ms。如果没有足够的数据流入Kafka,消费者获取最小数据量的要求就得不到满足,最终导致500ms的延迟。
如果fetch.max.wait.ms被设为100ms,并且fetch.min.bytes被设为1MB,那么Kafka在收到消费者的请求后,要么返回1MB数据,要么在100ms后返回所有可用的数据,就看哪个条件先得到满足。
-
max.partition.fetch.bytes:
该属性指定了服务器从每个分区里返回给消费者的最大字节数。它的默认值是1MB,也就是说,KafkaConsumer.poll()方法从每个分区里返回的记录最多不超过max.partition. fetch.bytes指定的字节。
-
session.timeout.ms:
该属性指定了消费者在被认为死亡之前可以与服务器断开连接的时间,默认是3s。如果消费者没有在session.timeout.ms指定的时间内发送心跳给群组协调器,就被认为已经死亡,协调器就会触发再均衡,把它的分区分配给群组里的其他消费者。该属性与heartbeat.interval.ms紧密相关。heartbeat.interval.ms指定了poll()方法向协调器发送心跳的频率,session.timeout.ms则指定了消费者可以多久不发送心跳。
一般需要同时修改这两个属性,heartbeat.interval.ms必须比session.timeout.ms小,一般是session.timeout.ms的三分之一
-
enable.auto.commit:
该属性指定了消费者是否自动提交偏移量,默认值是true。为了尽量避免出现重复数据和数据丢失,可以把它设为false,由自己控制何时提交偏移量。如果把它设为true,还可以通过配置auto.commit.interval.ms属性来控制提交的频率。
-
partition.assignment.strategy:
分区会被分配给群组里的消费者。PartitionAssignor根据给定的消费者和主题,决定哪些分区应该被分配给哪个消费者。Kafka有两个默认的分配策略。