kafka的消费者以pull的方式拉取消息


创建消费者时,若不指定group.id,则该消费者属于默认消费组


group.id全局唯一


同一个消费组下的消费者在消费消息时是互斥的


终端模拟消费者脚本 $KAFKA_HOME/bin/kafka-console-consumer.sh
脚本核心内容如下:

exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"

调用对象ConsoleConsumer,根据运行参数不同,分别调用老版本消费者和新版本消费者

参数

消费者对象

–zookeeper

旧版本高级消费者kafka.consumer.Zoo.KeeperConsumerConnector

–bootstrap-server

新版本消费者org.apache.kafka.clients.consumer.KafkaConsumer

在老版本消费者中from-beginning参数设置起始位置开始消费,默认不加此参数是从最新(latest)开始,执行该脚本时老版本消费者不支持–offset参数。
也就是说,使用老版本消费者只能指定从消息起始位置还是最新位置,而不能指定从任意偏移量开始消费


默认的Consumer.id格式为
hostname-当前的时间戳-UUID前8位数字 构成的字符串


启动一个旧版消费者在ZK中对应元数据的目录结构如下

nifi kafka 账密登录 kafka用户管理_java

节点名

用途

ids

包含了代表group.id下的所有消费者的临时znode,节点名${group.id}_${consumer.id}。当消费者退出临时节点就会被删除。get查看这些临时节点的内容如下 {“version”:1,“subscription”:{“kafka-action”:1},“pattern”:white_list",“timestamp”:“1489024110802”},其中subscription记录消费者订阅的主题列表以及每个主题对应的消费者线程数,timestamp记录消费者启动时的时间戳

owners

记录该消费组所消费的主题列表以及每个主题的每个分区对应的消费者线程,get /consumers/${group.id}/owners/${主题名称}/${分区编号} ----输出信息如---->${group.id}_${consumer.id}-${消费者线程编号}

offsets

记录了改消费组所消费的主题列表以及每个主题的每个分区对应的最大偏移量


新版本消费者去掉了对ZK的依赖,当启动一个消费者时不再向ZK进行注册,而是由消费者协调器(GroupCoordinator)统一管理,消费者已消费消息的偏移量提交会保存在名为__consumer_offsets的Kafka内部主题中


消费者偏移量存储在__consumer_offsets的分区编号计算公式如下
消费组名的hashCode值与__consumer_offsets主题分区总数(默认50)取模=消费者偏移量存储的分区编号

Math.abx(${group.id}.hashCode()) % ${offsets.topic.num.partitions}

查询__consumer_offsets topic所有内容

注意:运行下面命令前先要在consumer.properties中设置exclude.internal.topics=false

0.11.0.0之前版本

bin/kafka-console-consumer.sh --topic __consumer_offsets \
--zookeeper localhost:2181 --formatter "kafka.coordinator.GroupMetadata\
Manager\$OffsetsMessageFormatter" \
--consumer.config config/consumer.properties --from-beginning

0.11.0.0之后版本(含)

bin/kafka-console-consumer.sh --topic __consumer_offsets \
--zookeeper localhost:2181 --formatter "kafka.coordinator.group.GroupMetadata\
Manager\$OffsetsMessageFormatter" --consumer.config config/consu\
mer.properties --from-beginning

默认情况下__consumer_offsets有50个分区,如果你的系统中consumer group也很多的话,那么这个命令的输出结果会很多。


获取指定consumer group的位移信息

0.11.0.0版本之前

bin/kafka-simple-consumer-shell.sh --topic __consumer_offsets \
--partition 11 --broker-list localhost:9092,localhost:9092\
,localhost:9092 --formatter "kafka.coordinator.GroupMetadata\
Manager\$OffsetsMessageFormatter"

0.11.0.0版本以后(含)

bin/kafka-simple-consumer-shell.sh --topic __consumer_offsets \
--partition 11 --broker-list localhost:9092,localhost:9092,\
localhost:9092 --formatter "kafka.coordinator.group.GroupMetadata\
Manager\$OffsetsMessageFormatter"

__consumer_offsets topic的每一日志项的格式都是:

[Group, Topic, Partition]::[OffsetMetadata[Offset, Metadata], CommitTime, ExpirationTime]

同时消费多主题
启动如下消费者终端

kafka-console-consumer.sh --bootstrap-server server-1:9092,\
server-2:9092,server-3:9092 --new-consumer \
--consumer-property group.id=consume-multi-topic \
--whitelist "kafka-action|producer-perf-test

然后再启动2个生产者终端,分别向这两个主题发送消息,此时在消费者终端就可以看到2个主题的消息


(参考牟大恩的《kafka入门与实践》)