kafka中的消费者

把书读薄(Kafka权威指南 第四章)

消费者是与消费分区是如何对应的?

消费者从属于一个消费群组,一个群组里的消费者订阅同一个主题,每个消费者接受主题一部分分区的消息。消费者的数量应该小于等于分区的数量,如果消费者的数量超过分区数,那么超过部分会被闲置。不同消费组群互相不影响,如果一个应用要处理多个主题,,可以让多个主题公用一个消费者群组


能不能不要消费组?

可以。一个消费者可以自己订阅主题并加入消费组,或者为自己分配分区【不能同时做这两件事】,分配分区如果主题添加了新的分区,消费者不会收到通知,需要周期性的调用consumer.partitionsFor方法或者重启。【自己分配分区后是不会发生再均衡以及手动查找分区,其余一样】


消费者群组新加入消费者怎么处理?

1. 新加入的消费者它读取的消息是原本属于其它消费者读取的消息,一个消费者关闭或者崩溃则离开群组,原本应该被它读取的消息由其它消费者接受。
2. 分区的所有权从一个消费者转移到另一个消费者【再均衡】。这个过程中,消费者群无法处理消息。
3. 分区的所有权则通过消费者向被指派的 群组协调器 的broker发送心跳来维持,同时消费者的心跳行为也用来维持和群组的从属关系。如果消费者停止发送心跳的时间足够长,会话会过期,群组协调器认为它已经死亡,触发再均衡

谁是群主?

第一个加入消费组的是群组。负责给每一个消费者分配分区

分区新增时,消费者如何处理?

新增分区会发生分区重分配。


代码上如何创建消费者并订阅主题?

使用Propertites[包含 server,key.deserializer和value.deserializer]初始化 KafkaConsumer,通过consumer.subscribe即可订阅主题,主题可以是一个列表或者是一表达式【不确定是否是正则】

代码上消费者是如何获取数据的?

轮询。消费者订阅了主题后,轮询中处理所有细节,包括群组协调、分区再平衡、发送心跳和获取数据


如何优雅退出轮询?

添加shutdownhook,在钩子里头调用消费者的wakeup方法,这样如果读取poll,会抛出wakeup异常,然后调用close方法,保证最后的提交都已经完成,并且告知群组协调器,自己要离开群组,然后就触发了再均衡

消费者和线程之间的关系是什么?

一个群组里面有多个消费者,一个消费者只有一个线程

为什么kafka能够从上次断开的地方再开始读取消息?

kafka对每个分区都有一个偏移量,来跟踪当前消息消费到哪儿去了,如果配置自动提交【更新分区当前位置】,默认每5s就上报一次从poll中获取的收到的最大偏移量。但是这种自动方式如果在小于默认的时间之内发生了再均衡,会照成消息重复消费


想自己提交偏移量,避免自动提交存在的问题怎么办?

1. 同步提交 [commitSync()],提交最后一次的偏移量。只要不是不可恢复的问题,就会一直重试,但是在broker对提交做出反应前,会一直阻塞,有可能成为吞吐量的瓶颈
2. 异步提交[commitAsync()],提交最后一次的偏移量。不重试,如果异步提交出现问题,可以通过回调来观察


某些操作我一定要成功,但是又不想每次阻塞,怎么办?

混用同步提交和异步提交。在消息处理的时候异步提交,如果出了问题就catch住,然后同步提交


同步提交和异步提交都只能对最后一次进行提交,我想更频繁的,更自助的控制好提交的频率,怎么做?

用map存储每个分区的偏移量,然后根据自己的需求,在读取消息后,异步提交整个map

猜你喜欢

转载自blog.csdn.net/weixin_39687783/article/details/80148827