【kafka】二、kafka框架介绍(消费者篇):

本文深入探讨Kafka消费者配置,包括NewConsumerConfigs与OldConsumerConfigs的区别,偏移量管理策略,发布订阅与队列模式,及如何优化fetch.min.bytes参数以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人菜鸡,正在努力学习,记录知识以备后患!

该文章承接上文(kafka系列),暂有两篇:

【kafka】一、kafka框架介绍(生产者篇):https://blog.youkuaiyun.com/lsr40/article/details/84029034

【kafka】二、kafka框架介绍(消费者篇):https://blog.youkuaiyun.com/lsr40/article/details/84034394

另一篇解决报错的文章:

【kafka】报错:advertised.listeners参数的重要性(外部访问局域网kafka)https://blog.youkuaiyun.com/lsr40/article/details/84135959

消费者有两个配置,一个是New Consumer Configs(让kafka自己管理偏移量),一个是Old Consumer Configs(使用默认zk管理偏移量),具体使用的时候,请认准自己的kafka的版本

官网:http://kafka.apache.org/documentation/#consumerconfigs

(消费者偏移量记录)当然,在说参数前,我要说说消费者的一些事情:

消费者消费数据的时候,必须记录每个分区消费到哪了,也就是说,如果消费者A读取的那个topic有10个分区的话,必须记录10个值,这10个值分别表示每个分区被消费到哪里(通过offset偏移量来记录),因此就有以下的概念,这些消费者的消费记录保存在哪里?

  1. 手动管理:通过api,获取拿到的该条数据的偏移量和分区值,保存在存储系统中(可以是数据库,可以是文件等方式),当然自己管理是最麻烦的一种方式,但也是可控的东西最多的。关于这个我看到了有一个系列的文章(感谢作者:葬月魔帝),大家有兴趣可以关注下!
                如何管理Spark Streaming消费Kafka的偏移量(一)https://blog.youkuaiyun.com/u010454030/article/details/78535003

    如何管理Spark Streaming消费Kafka的偏移量(二)

    https://blog.youkuaiyun.com/u010454030/article/details/78554643
                如何管理Spark Streaming消费Kafka的偏移量(三)https://blog.youkuaiyun.com/u010454030/article/details/78660643
  2. zookeeper管理:配置,offsets.storage=zookeeper,auto.commit.enable=true(开启自动提交偏移量)接着auto.commit.interval.ms=60*1000(默认值:1分钟提交一次),缺点:提交之后程序又运行了30s之后挂掉了,下次消费的时候就会重复消费那30s的数据,反复的跟zk交互,影响性能。
  3. kafka管理:offsets.storage=kafka,enable.auto.commit=true,auto.commit.interval.ms=5000(默认是5s提交一次),实现原理是kafka自己创建一个名为__consumer_offsets的topic,将offset存储在该topic下,推荐采用该方式,关于如何读取这个topic的信息:(感谢作者:huxihx)https://www.cnblogs.com/huxi2b/p/6061110.html,当然也可以使用其他的监控工具,例如kafka-manager之类的别人写好的框架,通过前端页面查看topic的数据情况,和消费者偏移量情况。
  4. 偏移量的管理涉及到三种语义
    至少一次生产者同步发送消息(将acks设置为1或者-1/all)
    至多一次生产者异步发送消息,无论接受到与否
    仅此一次手动管理偏移量,做到处理一条保存一次偏移量,或者批量处理一批(处理未结束失败了要记得回滚),保存一次
    kafka有给出java版api:http://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html,在Storing Offsets Outside Kafka该模块中有介绍。

-1.group.id:消费者的组id(非常重要),他涉及到了发布订阅和队列模式

  • 发布订阅模式:不同groupid的消费者之间消费数据互不影响,也就是说可以同时消费同一份数据。举个例子:groupid就好像家庭id,家庭A定了一份人民日报(topic1),家庭B也定了一份人民日报(也是topic1),那么当家庭A在看他们家买的人民日报的时候,丝毫不影响家庭B,家庭B可以同时看相同内容,也可以看不相同
  • 队列模式:相同group_id的消费者之间不可能消费同一份数据,举个例子:家庭A定了一份人民日报(topic1),人民日报里面有3个板块(3个分区),当爸爸(消费者1)在看第一个板块的时候(分区1),其他家庭成员就不能再看相同的板块,只能去看板块2(分区2)或者板块3(分区3)

-2.Rebalance:通过zookeeper实现的消费者负载均衡机制,在队列模式下,如果多个消费者的group_id相同,那么他们就会触发负载均衡机制。举个例子:topicA有3个分区,我启动了一个消费者x(默认这里的消费者都只有一个线程),那么消费者x就会独自消费3个分区的数据。这时,我又启动了消费者y(group_id和x相同),那么就会马上触发负载均衡机制,一个消费者消费2个分区数据,另一个消费1个分区,这时候我又启动了一个消费者z(group_id和x和y相同),这样每个消费者都会消费1个分区的数据。也就是说当消费者的总个数(总线程数)和topicA的分区数一样的时候,性能最好如果这时候再增加消费者,那么就会出现有一个消费者空转(消耗资源,但接受不到数据),导致资源浪费。

-3.fetch.min.bytes:设置最少一次拉取多少数据,默认是一有数据就拉,可以调大,但是数据就会有延迟,但是请求的次数就降低,提升吞吐量(一般默认就可以了)

其他的基本上不需要太大的调整(当然如果有特殊需求的话,不同集群情况下,参数最优肯定都是不同的,还需要具体测试),为了提升性能,有时候还需要调整broker和topic的配置,这两部分本人暂时没有做太深入的研究,就不在这里瞎***吹了!

最后kafka自带消费者:

bin/kafka-console-consumer.sh --topic topic名称 --zookeeper zk1:端口1,zk2:端口2,zk3:端口3/zk上kafka的路径

总结:考虑偏移量如何管理,考虑发布订阅还是队列模式,考虑消费模式是否达到最优,是否设置拉数据的延迟,是否可以优化消费端的代码来减少数据延迟

kafka系列文章暂时到这,主要就介绍了对于集群使用者的相关参数(生产者和消费者),对于搭建集群(topic和broker)的一些参数,并没有相关的介绍,原谅本人才疏学浅。如果有什么问题或者笔误的地方,欢迎可以留言评论~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值