【消息队列】细说Kafka消费者的分区分配和重平衡

这篇具有很好参考价值的文章主要介绍了【消息队列】细说Kafka消费者的分区分配和重平衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

消费方式

我们直到在性能设计中异步模式,一般要么是采用pull,要么采用push。而两种方式各有优缺点。

  • pull :说白了就是通过消费端进行主动拉去数据,会根据自身系统处理能力去获取消息,上有Broker系统无需关注消费端的消费能力。kafka采用pull模式
  • push : Broker主动推送消息到消费端,但是由于各个消费端吞吐量能力不同,可能推送相同的消息,不同的consumer处理能力不能,造成消息堆积。并且也需要下游系统的服务情况,以及当下游系统进行扩容或者宕机的时候都需要及时获取,这在设计难度上比较高。
    kafka分组消费,# 消息队列,kafka,java,分布式

消费者总体流程

kafka分组消费,# 消息队列,kafka,java,分布式

消费者组

Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制

  • 消费者组有一个或多个消费者实例
  • Group Id 标识一个消费者组 是唯一值,不同的Group 消费互相不影响
  • Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其他的 Group 消费

设置多少个消费者?
理想情况下,Consumer 实例的数量应该等于该 Group 订阅主题的分区总数。假设Group 订阅了3个主题,每个主题有3个分区,那么设置9个消费者最好,

kafka分组消费,# 消息队列,kafka,java,分布式
kafka分组消费,# 消息队列,kafka,java,分布式

消费组初始化过程

kafka分组消费,# 消息队列,kafka,java,分布式

消费者组详细消费过程

kafka分组消费,# 消息队列,kafka,java,分布式

分区的分配

分区的分配: 首先说一下什么是分区的分配,通俗一点的话就是,我们直到一个Topic下可能存在多个分区,而同时可能存在多个Topic,也就是多Topic+多分区,而消费者这边为了提升消费能力,也会设置多个消费者组,每个消费者组都包含多个消费者,而如何将分区的消息对应到具体的消费者组下的消费者就是分区的分配。
kafka分组消费,# 消息队列,kafka,java,分布式
如上图所示,具体会根据流程来进行分区的分配。

  • 1.每个consumer发送Join Group请求到Broker的leader
  • 2.选择出一个consumer作为一个Leader。
  • 3.coordinator 把要消费的topic情况发送给Leader消费者
  • 4.Consumer Leader会负责指定消费方案
  • 5.把消费方案发给coordinator
  • 6.coordinator把消费方案发给各个consumer
  • 7.每个消费者和coordinator保持心跳,超时或者处理时间过长会触发在平衡。

1而在分区分配的时候有对应的分区策略具体就是如下三种方式

Range分区策略原理

kafka分组消费,# 消息队列,kafka,java,分布式
总体思想就是将topic的分区和消费者进行排序,分区数/消费者个数。将对于出来的交给消费者排名考前的消费者,图中是7个分区,3个消费者。7/3 余 1,C0消费3个,C1和C2消费2个。

缺点:如果针对的topic和分区多,那么靠前的消费者可能会承担较多的消费。

RoundRobin以及再平衡

kafka分组消费,# 消息队列,kafka,java,分布式
直接就是按照分区进行hash,排序,比如7个分区,分别C0负责0,3,6,C1负责1,4,C2负责2,5

Sticky以及再平衡

粘性分区的出现主要是避免分区的变动,节省开销。
首先会尽量均衡的放置分区到消费者上面,在出现同一消费者组内消费者出现问题的时候,会尽量保持原有分配的分区不变化。

重平衡

重平衡:首先大家看到重平衡有点懵逼,说白了,就是在上述分区分配的过程中,如果出现消费者组中消费者退出或者新加入消费者的时候,需要将消费者组内对所消费的Topic的分区达成共识的过程。这个共识说白了就是AConsumer消费那个分区,BConsumer消费那个分区的过程。

协调者:在分区分配的过程中引入了一个协调者的概念,而这个针对的级别是每个Broker都有自己各自的Coordinator组件,比如你部署了三台Broker集群,那么就有三个Coordinator。作用主要是负责为Consumer Group服务,提供Rebalance以及位移管理和组成员管理的。

kafka确定consumer group的Coordinator的过程

  • 确定位移主题的那个分区保存Group:partitionId=Math.abs(groupId.hashCode() % offsetsTopicPartitionCount)。
  • 找出该分区的Leader副本所在的Broker,该Broker就是对应的Coordinator。

我们举一个案例来描述一下,假设我们的GroupId 是test,hash值是15,对应的分区是12个,15%12 = 3,那么分区3就是存储Group信息的分区,而通过这个分区3在找到对应的Leader副本,就可以确定在哪个Broker了。进一步找到对应的Coordinator。

如何避免重平衡

为什么要避免重平衡

  • 在Rebalance过程中影响消费者的TPS,这个期间Consumer会停下手上所有的事情。
  • Rebalance过程是比较慢的,会影响实时在线业务

发生Rebalance的时机

  • 组成员数量发生变化
  • 订阅主题数量发送变化
  • 订阅主题的分区数发生变化

后两个其实是主动操作,是不可避免的。而大多数的Rebalance都是由于consumer成员发生变动导致的,一个是增加,增加消费者本身是为了提升系统消费者的吞吐量,这个不在控制范围,而减少就是重中之重的避免rebalance。

从上图我们直到,consumer会定期的向协调者Coordinator发送心跳检测,如果不能在固定时间内
session.timeout.ms 默认10S 发送心跳,Coordinator会认为consumer死亡,从而发生rebalance。

heartbeat.interval.ms 是发送心跳的频率,一般来说越高频发送心跳检测,那么消耗的带宽资源就越多。

max.poll.interval.ms consumer端两次调用poll的最大时间间隔,默认是5分钟,如果5分钟没有消费poll方法返回的消息,那么会主动发起离开组的请求,开启新的一轮rebalance。

如何避免

  • 避免rebalance未能及时发送心跳而导致触发Rebalance。需要合理设置参数值
    • 设置 session.timeout.ms = 6s。
    • 设置 heartbeat.interval.ms = 2s。
    • 要保证 Consumer 实例在被判定为“dead”之前,能够发送至少 3 轮的心跳请求,即 session.timeout.ms >= 3 * heartbeat.interval.ms。
  • Rebalance 是 Consumer 消费时间过长导致的,根据业务处理时间设置 max.poll.interval.ms的值。如果业务处理50S,那么就设置55S

小结

本篇从消费者角度描述了一下 消费者组和消费者的关系,以及消费者组和分区的关联流程,而从中引出了重平衡的话题,而在实际的生产环境中我们需要避免重平衡的发生。文章来源地址https://www.toymoban.com/news/detail-661193.html

到了这里,关于【消息队列】细说Kafka消费者的分区分配和重平衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kafka消费者api和分区分配和offset消费

    消费者的消费方式为主动从broker拉取消息,由于消费者的消费速度不同,由broker决定消息发送速度难以适应所有消费者的能力 拉取数据的问题在于,消费者可能会获得空数据 Consumer Group(CG):消费者组 由多个consumer组成。形成一个消费者组的条件,是所有消费者的groupid相同

    2024年02月16日
    浏览(49)
  • Kafka有几种消费者分区分配策略?

    Range范围分配策略是Kafka默认的分配策略,它可以确保每个消费者消费的分区数量是均衡的。 注意:Rangle范围分配策略是针对每个Topic的。 配置 配置消费者的partition.assignment.strategy为org.apache.kafka.clients.consumer.RangeAssignor。 算法公式 n = 分区数量 / 消费者数量 m = 分区数量 % 消费

    2024年02月08日
    浏览(45)
  • kafka消费者组的分区分配策略

    一个consumer group有多个consumer,一个topic有多个partition,所以就会设计到分区分配的问题,需要确定哪些分区由哪些消费者消费。 当消费者组中的消费者发生变化,减少或者增加的时候,就会执行分区分配策略,需要重新洗牌。 分区分配策略主要有两种,第一种是Range范围分区

    2024年02月16日
    浏览(47)
  • Kafka3.0.0版本——消费者(分区的分配以及再平衡)

    1.1、消费者分区及消费者组的概述 一个consumer group中有多个consumer组成,一个 topic有多个partition组成。 1.2、如何确定哪个consumer来消费哪个partition的数据 Kafka有四种主流的分区分配策略: Range、RoundRobin、Sticky、CooperativeSticky。 可以通过配置参数 partition.assignment.strategy ,修改分

    2024年02月07日
    浏览(53)
  • Kafka3.0.0版本——消费者(RoundRobin分区分配策略以及再平衡)

    RoundRobin 针对集群中 所有Topic而言。 RoundRobin 轮询分区策略,是把 所有的 partition 和所有的consumer 都列出来 ,然后 按照 hashcode 进行排序 ,最后通过 轮询算法 来分配 partition 给到各个消费者。 2.1、创建带有7个分区的sixTopic主题 在 Kafka 集群控制台,创建带有7个分区的sixTopi

    2024年02月07日
    浏览(40)
  • Kafka3.0.0版本——消费者(Sticky分区分配策略以及再平衡)

    粘性分区定义:可以理解为分配的结果带有“粘性的”。即在执行一次新的分配之前,考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量的开销。 粘性分区是 Kafka 从 0.11.x 版本开始引入这种分配策略, 首先会尽量均衡的放置分区到消费者上面, 在出现同一消

    2024年02月09日
    浏览(43)
  • 分布式 - 消息队列Kafka:Kafka消费者和消费者组

    1. Kafka 消费者是什么? 消费者负责订阅Kafka中的主题,并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者

    2024年02月13日
    浏览(41)
  • 分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

    01. 创建消费者 在读取消息之前,需要先创建一个KafkaConsumer对象。创建KafkaConsumer对象与创建KafkaProducer对象非常相似——把想要传给消费者的属性放在Properties对象里。 为简单起见,这里只提供4个必要的属性:bootstrap.servers、key.deserializer 和 value.deserializer。 ① bootstrap.servers 指

    2024年02月12日
    浏览(42)
  • 分布式 - 消息队列Kafka:Kafka 消费者的消费位移

    01. Kafka 分区位移 对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中对应的位置。偏移量从0开始,每个新消息的偏移量比前一个消息的偏移量大1。 每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从 0 开始,假设一

    2024年02月12日
    浏览(46)
  • 【Kafka-Consumer分区分配策略】Kafka 消费者组三种分区分配策略 Range Assignor、RoundRobin Assignor、Sticky Assignor 详细解析

    1、一个 consumer group 中有多个 consumer 组成,一个 topic 有多个 partition 组成,现在的问题是,到底由哪个 consumer 来消费哪个 partition 的数据。 2、Kafka有四种主流的分区分配策略: Range、RoundRobin、Sticky、CooperativeSticky。 可以通过配置参数 partition.assignment.strategy ,修改分区的分配

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包