hello,小伙伴们。
相信很多小伙伴们在学习或者使用Kafka的时候, 常常被一个叫做偏移量的东西整的迷迷糊糊的一头雾水。
我们今天就来仔细地梳理一下关于这部分的知识。
这篇文章,分为四部分,介绍消费者群组、消费者属性配置、偏移量提交方案(重点)、再均衡方案(重点)。话不多说,我们从消费者开始聊起。
消费者和消费者群组
关于消费者群组,面试官常常问一个问题:如何增加Kafka消费者的消费能力。挖坑警告!!!
很多小伙伴就会回答道:在消费者群组中增加消费者的数量。 恐怕可以直接领取回家等候通知体验卡一张了。
我们首先看一张图吧。
这边一定注意的一点就是,如上图Consumer Group1 中所画的那样,3个partition只会对应到消费者群组中的3个consumer ,多出来的第4个consumer并没有用!不能增加消费者的消费能力! 所以单纯回答增加consumer,是不对的鸭!
设置消费者属性(重点)
创建消费者的第一步,是要设置消费者属性。篇幅有限,只介绍几个常识性的属性,其他的大家可以下载思维导图源文件查看。
- enable.auto.commit:
是否自动提交偏移量。如果项目严格控制偏移量提交的话,可以设置false,然后手动提交。 - auto.offset.rest:
一个消费者读取没有偏移量的分区或者偏移量无效的情况下,该如何处理。默认值latest:从最新的偏移量开始读取,可能造成数据丢失。
另一个值:earliest,从起始位置读取,可能造成重复消费。 - partition.assignment.strategy(消费者的分区策略):
RoundRobin(轮询):默认值,随机均匀分配到不同的消费者。
Range(范围):会把主题的若干个连续分区分配给同一个消费者。可能造成分区不均匀的情况。
可见下图。T1 和T2,都把自己的0,1分区分给了C1,而C2只分配到p1分区。
提交偏移量(重点)
首先我们需要了解的是,消费者通过往一个_consumer_offset的主题发送自己已经消费分区的偏移量。
提交偏移量三种方式:
- 自动提交:
消费者处理完一批消息后,提交一次偏移量。这种情况下,如果提交失败,就会导致重新消费这一批消息,重复消费。 - 手动同步提交:
消费者处理完一条消息后,提交一次当前消息的偏移量。如果提交异常,消费者会自动尝试重试提交。这种情况下,偏移量提交是同步的,吞吐量会下降。 - 手动异步提交:
消费者处理完一条消息后,提交一次当前消息的偏移量。如果提交异常,消费者不会尝试重试提交。 - 同步和异步组合提交:
这种方案也是运用比较多的,我司就是利用这种方式。首先尝试异步提交,如果出现异常 之后,在捕获异常的地方同步提交,让同步方法进行重试。
// 同步异步组合提交偏移量
try{
// 异步提交,出现异常不会重试
consumer.commitAsync();
}catch(Exception ex){
// 出现异常后,利用同步提交,重试。
consumer.commitSync();
}
再均衡
再均衡是指, 消费者退出或者加入时,对消费者移除或者重新分配Partition 的行为。其实这边玩的花头可以很多。
消费者退出的时候保存offset入数据库,等重新加入的时候,再从数据库中获取offset,继续消费,可以有效的避免丢失数据或者重复消费。一起看下伪代码吧!
// 实现kafka的分区监听器
public class OffsetRebalance implements ConsumerRebalanceListener{
// 伪代码:当消费者退出时执行,保存当前消费的offset入数据库
@Override
public void onPartitionsRevoked(Collection<TopicPartition> partitions) {
saveOffsetToDB();
}
// 伪代码:当消费者加入时执行,从数据库获取partition的offset
@Override
public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
for (TopicPartition partition : partitions) {
consumer.seek(partition,getOffsetFromDB(partition));
}
}
}
总结:
说了这么多,有些小伙伴又要记不住啦! 让我们看看本章节的思维导图吧!
定期分享优质的知识思维导图,帮助大家建立结构化的知识体系,欢迎关注~