1、消费消息
kafka 的消费者以pull的方式获取消息,同时kafka采用消费组的模式,每个消费组都属于某一个消费组(在创建消费者时若不指定消费组,则属于默认消费组),消费组是一个全局概念,因此设置group.id时,要确保该值在kafka集群中唯一。
对于同一条消息,只能被同一个组下某一个消费者消费,但不同消费组的消费者能消费同一条消息。
1):旧版高级消费者
启动消费者 kafka-console-consumer.sh 脚本时,若指定zookeeper参数,则调用旧版高级消费者。
kafka-console-consumer.sh --zookeepe localhost:2191 --topic kafka-action --consumer-property group.id=old-consumer-test --consumer-property consumer.id=old-consumer-id --from-beginning --delete-consumer-offsets
zookeeper 参数用于指定连接kafka的zookeeper地址设置。
topic 参数用于指定消费者消费的主题。
consumer-property 参数后面以键值对的形式指定消费者级别的配置。
form-beginning 参数设置从消息起始位置开始消费,默认是从最新的位置(latest)开始消费。旧版本不支持--offset参数,所以不能指定从任意偏移量开始消费。
delete-consumer-offset 参数用于删除在 zookeeper 中记录的已消费的偏移量。若在一个已存在消费者的消费组中新增一个消费者,这个消费者若指定了 from-beginning 参数,则必须指定该参数,以删除其他消费者在 zookeeper 中记录的已被消费的最大偏移量。
旧版本的消费者默认将消费偏移量保存在zookeeper中,若设置 offset.storage=zookeeper则将偏移量保存到zookeeper中;若这是offset.storage=kafka则将偏移量保存到kafka内部主题中,但是dual.commit.enabled=true时同时将偏移量保存在zookeeper中。
每个消费者被创建时都会向 zookeeper 中注册相应的元数据信息,若该消费者所属的消费组在zookeeper中不存在,则首先在/consumer 目录下创建一个名为${group.id}的节点,即消费组节点,并创建名为ids、owners、offsets的3个子节点。
ids:记录该消费组下正在运行的消费组列表,一个新的消费者被创建时会在 zookeeper 中与之对应的消费组节点的ids子节点下注册一个临时节点,该临时节点的名称为${group.id}_${consumer.id}。
owners:记录该消费组消费的主题列表,owners节点的子节点中记录该消费组所消费的主题列表以及每个主题的每个分区对应的消费者线程。
offsets:记录该消费组下每个消费者所消费主题的各个分区的偏移量,若在启动消费者时指定了offset.storage=kafka,则偏移量会保存到kafka内部主题中,就不会有该节点。
2):旧版低级消费者
kafka-simple-consumer-shell.sh 脚本用于调用kafka的低级消费者。
低级消费者需要自己管理消费偏移量,同时只能消费某个主题的某个分区的消息;
kafka-simple-consumer-shell.sh --broker-list localhost:9092 --clientId simple-consumer-test --offset -1 --partition 0 --topic kafka-action
以上该命令启动了一个低级消费者,从主题为 kafka-action 的编号为0的分区消费消息,--offset指定消费的起始位置,该参数支持任意非负整数和-1、-2两个负整数;
3):新版高级消费者
启动消费者 kafka-console-consumer.sh 脚本时,若不指定zookeeper参数而指定bootstrap-server参数,则调用新版高级消费者。
新版本消费者已消费消息的偏移量提交后会保存到名为“ _consumer_offsets”的内部主题中。
启动一个新版消费者:kafka-console-consumer.sh --bootstrap-server localhost:9092 --new-consumer --consumer-property group.id=new-consumer-test --consumer-property client.id=new-consumer-id --topic kafka-action
new-consumer 参数直接指定调用新版的消费者,若以bootstrap-server方式启动,则默认调用的是新版消费者。
查看消费组名信息命令:kafka-consumer-group.sh --bootstrap-server localhost:9092 --list --new-consumer
消费多主题:kafka-console-consumer.sh --bootstrap-server localhost:9092 --new-consumer --consumer-property group.id=new-consumer-test --consumer-property client.id=new-consumer-id --whitelist "kafka-action|producer-per-test"
2、单播与多播
单播:一条消息只能被某一个消费者消费的模式,实现消息单播模式,只需要让这些消费者属于同一个消费组即可;
多播:一条消息可以被多个消费者消费的模式,实现多播模式,只需要让每个消费者均属于不同的消费组。
3、查看消费偏移量
kafka提供了 kafka-consumer-group.sh 脚本查看消费偏移量;
该脚本支持 --zookeeper 和 --bootstrap-server 两种运行方式,支持 list、describe 和 delete 三种操作方式;
list:返回与启动方式对应的所有消费组,即若是以参数zookeeper启动,则返回的是老版本的消费者对应的消费组信息,否则返回新版本的消费者隶属的消费组信息;
describe:查看某个消费组当前的消费情况;
delete:删除消费组;支持删除不包含任何消费者的消费组;只能删除消费组为老版本消费者对应的消费组;也可以指定删除某个主题的消费组;
4、消费者性能测试工具
kafka 提供了 kafka-consumer-perf-test.sh 脚本对新、旧两个版本的消费者性能进行测试。
测试脚本提供了以下参数:
--broker-list 指定kafka代理
--threads 指定消费者的线程数
--messages 指定总控消费多少条消息
--message-size 指定每条消息的大小
--num-fetch-threads 默认值为1
--group 指定消费组
--topic 指定消费的主题
--new-consumer 指定对新版本的消费者进行性能测试
--consumer.config 指定消费者级别的配置,以上所有的配置都可以配置在 consumer.config 指定的配置文件中