Kafka消费者提交偏移量?再均衡?你了解多少?收藏一下这篇思维导图吧!

4 篇文章 0 订阅
3 篇文章 0 订阅

hello,小伙伴们。
相信很多小伙伴们在学习或者使用Kafka的时候, 常常被一个叫做偏移量的东西整的迷迷糊糊的一头雾水。
我们今天就来仔细地梳理一下关于这部分的知识。
这篇文章,分为四部分,介绍消费者群组、消费者属性配置、偏移量提交方案(重点)、再均衡方案(重点)。话不多说,我们从消费者开始聊起。

消费者和消费者群组

关于消费者群组,面试官常常问一个问题如何增加Kafka消费者的消费能力。挖坑警告!!!
很多小伙伴就会回答道:在消费者群组中增加消费者的数量。 恐怕可以直接领取回家等候通知体验卡一张了。
我们首先看一张图吧。
在这里插入图片描述

这边一定注意的一点就是,如上图Consumer Group1 中所画的那样,3个partition只会对应到消费者群组中的3个consumer ,多出来的第4个consumer并没有用!不能增加消费者的消费能力! 所以单纯回答增加consumer,是不对的鸭!

设置消费者属性(重点)

创建消费者的第一步,是要设置消费者属性。篇幅有限,只介绍几个常识性的属性,其他的大家可以下载思维导图源文件查看。

  1. enable.auto.commit:
    是否自动提交偏移量。如果项目严格控制偏移量提交的话,可以设置false,然后手动提交。
  2. auto.offset.rest:
    一个消费者读取没有偏移量的分区或者偏移量无效的情况下,该如何处理。默认值latest:从最新的偏移量开始读取,可能造成数据丢失。
    另一个值:earliest,从起始位置读取,可能造成重复消费。
  3. 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));
            }
        }
    }

总结:

说了这么多,有些小伙伴又要记不住啦! 让我们看看本章节的思维导图吧!

下面是我整理的思维导图,源文件请关注我新建的wx公众号: 程序员BenJi , 回复 kafka 即可获取
定期分享优质的知识思维导图,帮助大家建立结构化的知识体系,欢迎关注~
在这里插入图片描述

回复面试,可获取我整理的大场面试资料一份!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值