1. 消费方式
-
pull(拉)模式从 broker 中主动拉取数据。
-
pull 模式不足之处:
如果 kafka 没有数据,消费者可能会陷入循环中,一直返回空数 据。针对这一点,Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有 数据可供消费,consumer 会等待一段时间之后再返回,这段时长即为 timeout。
push(推)模式由Broker推送给consumer
-
push模式不足之处:
尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息, 典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 consumer 的消费能力以适 当的速率消费消息。
2.分区策略
一个 consumer group 中有多个 consumer,一个 topic 有多个 partition,所以必然会涉及 到 partition 的分配问题,即确定那个 partition 由哪个 consumer 来消费。
Kafka 有两种分配策略,一是 RoundRobin,一是 Range。
策略一:RoundRobin轮询分配
- 同一个topic下的多个partition会采用轮询的方式将不同的partition分配给同一个consumer group中的多个consumer。
- 当消费者数量发生变化时会触发分配策略重新分配。
- 注意点:
该策略模式的使用前提是该消费者组中的所有消费者订阅的都是相同的topic。
策略二: Range案范围分配(默认策略)
- 同一个topic下的partition数量除以消费者组中的消费这数量,得到的就是每个consumer消费的分区数。
- 注意点:
当同一个消费者组中的不同消费者 订阅的是不同的topic,那么会导致将同一个topic下的所有partition都分配给某个consumer,如果不同topic的partition数量相差较大,会导致不同消费者消费的partition数相差较大,不利于资源的合理利用。
3 offset 的维护
由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故 障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢 复后继续消费。
主题+主题分区+消费者组 决定offset的量
-
注意
- Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始, consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为 consumer_offsets。
- 修改配置文件 consumer.properties
exclude.internal.topics=false //排除内部的主题,consumer_offsets为系统主题
-
2. 读取 offset
-
0.11.0.0 之前
-
0.11.0.0 之后版本(含):
bin/kafka-console-consumer.sh --topic __consumer_offsets --zookeeper server-3:2181 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties --from-beginning