Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kafka消费组及重平衡的影响

kafka消费组及重平衡的影响

作者头像
一条老狗
发布于 2020-06-16 07:48:27
发布于 2020-06-16 07:48:27
4K0
举报
文章被收录于专栏:极客运维极客运维

消费组应该算是kafka中一个比较有特色的设计模式了,而他的重平衡机制也是我们在实际生产使用中,无法避免的一个问题。

消费组

Consumer Groupkafka提供了可扩展、高容错特性的消费者机制。简单介绍下,大致有以下特点:

  • 一个Consumer Group内可以有多个Consumer实例,该实例可以是一个进程,也可以是进程下的多线程
  • 每个Consumer Group有一个唯一标识的Group ID
  • 不同Consumer Group之间相互独立,互不影响
  • Consumer Group内实例,与订阅的topic分区关系是一对一,或一对多的关系,Consumer Group会通过Coordinator尽量保持公平分配

理想情况下,我们应该设置Consumer实例的数量等于该Group订阅topic的分区总数,可以最大发挥消费性能。若设置的Consumer实例数少于订阅的分区数,则会为每个Consumer实例分配多个分区,消费性能会有所下降。若设置的Consumer实例数大于订阅的分区数,则会为每个Consumer实例分配 1 个分区进行消费,多余的Consumer实例则会闲置,只会浪费资源。

重平衡

重平衡(Rebalance)就是让一个Consumer Group下所有的Consumer实例,合理分配消费订阅topic的所有分区的过程。有 3 种情况会触发Consumer GroupRebalance

  1. Group下实例数发生变化。有新的Consumer实例加入或者离开组。
  2. 订阅的topic数发生变化。Consumer Group可以使用正则的方式订阅topic,比如 consumer.subscribe(Pattern.compile(“public.*log”)),该Group订阅所有以 public 开头,log 结尾的topic。这期间,新建了一个满足这样条件的topic,那么该Group也会发生Rebalance
  3. topic分区数发生变化。比如topic扩分区的时候,也会触发Rebalance

单看上面任一触发条件,都没啥毛病。问题在于Rebalance过程中会出现以下问题:

  • Rebalance过程的表现有些类似JVM FGC的情况,期间整个应用都会夯住,所有Consumer实例都会停止消费,等待Rebalance完成。
  • Rebalance过程中,所有Consumer实例都会参与重新分配。即便Consumer Group中部分Consumer实例分配合理,也需要打散重新分配,会导致TCP重新建立连接,是一个比较重的操作,较为浪费资源。
  • Rebalance的耗时取决于Consumer Group下的实例数量,一旦实例数过多,耗时极长,会造成大量消费延迟。

避免重平衡

对于上述Rebalance带来的一些弊端,从目前的社区版来看,暂时还没有很好的解决办法,我们只能尽量避免Rebalance的发生。在生产业务场景中,很多Rebalance都是预期外或者不必要的。我们应用的TPS大多是被这类Rebalance拖慢的。

从上述的 3 个Rebalance触发条件抓手,后两条topic数量及分区数变化,一般都是主动运维的相关操作,这种操作带来的Rebalance一般是必然发生,难以避免的,我们组要来讨论下Consumer Group组成员变化引发的Rebalance

Consumer Group实例增加的情况比较单一,当新启动一个Consumergroup.id已经存在,Coordinator会接管这个新实例,将其加入group.id相同的组,并重分配分区。这种操作场景,一般都还是预期内的,可能是通过扩容来提高TPS的操作。Consumer Group实例数减少的情况就比较复杂了。除了正常停止下线某些Consumer实例,还会出现Coordinator误判实例为已停止状态,从而主动踢出Group。导致Rebalance发生。每个Consumer会定期向Coordinator发心跳包,保持keepalive。如果因为某些特殊原因,如网络抖动时,某个Consumer实例没有及时发送心跳请求,Coordinator会将其判定为离线,并从Group中移除,并开启新一轮Rebalance。针对这个问题,可以通过设置Consumer端一下几个参数来进行优化调整:

  • session.timeout.msConsumer Group内实例的心跳超时时间,默认值是 10s
  • heartbeat.interval.ms即心跳请求频率,频繁发送心跳请求会额外消耗带宽资源,但是能够更及时的触发Rebalance,默认值为 3s
  • max.poll.interval.ms调用poll方法的时间间隔,默认值为 5min。期间没消费完poll回的消息,Coordinator会开启新一轮Rebalance

根据平时的实践经验,建议: session.timeout.ms=6s heartbeat.interval.ms=2s 原则上最好是满足session.timeout.ms >= 3 * heartbeat.interval.ms公式。

max.poll.interval.ms则需要根据下游实际消费能力进行调整,尽量设置的大一点,需要大于下游的最大消息处理时间。

如果进行完上述的各种调整后,还是频发触发Rebalance,最好再去排查下Consumer端的 GC 情况,实际生产环境中我经常碰到因为 GC 设置问题导致的Consumer程序频发 FGC 的问题,从而导致非预期内的Rebalance


相关推荐:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ckafka消费者组反复重平衡问题解决之道
Ckafka 消费重平衡机制同开源kafka一样,就是让一个消费者组下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在重平衡过程中,所有 Consumer 实例共同参与,在协调者组件的帮助下,完成订阅主题分区的分配。但是,在整个过程中,所有实例都不能消费任何消息,会影响到我们业务消息的正常消费。
邓愉悦
2020/10/21
3.8K0
【Kafka专栏 01】Rebalance漩涡:Kafka消费者如何避免Rebalance问题?
Kafka中的Rebalance是消费者组(Consumer Group)内部的一个重要机制,它指的是消费者实例之间重新分配Topic分区(Partition)的过程。在Kafka集群中,Rebalance是为了确保消费者组能够均匀地消费数据而设计的。然而,这个过程在某些场景下,如消费者实例的加入或离开、Topic或Partition数量的变化,甚至是网络波动,都可能导致不必要的触发。频繁的Rebalance会极大地增加消费者组的开销,影响整体的性能和稳定性。因此,本文将深入探讨和分析导致Rebalance的潜在原因,并提出一系列有效的优化策略,以帮助开发者和管理员避免不必要的Rebalance,从而提高Kafka消费者组的性能和可靠性。
夏之以寒
2024/06/05
1.8K0
解密kafka为啥总是在重平衡
使用的是java SDK :kafka-clients:2.1.0, kafka版本:2.4.1
沐榕樰
2024/08/01
2320
线上Kafka突发rebalance异常,如何快速解决?
Kafka 是我们最常用的消息队列,它那几万、甚至几十万的处理速度让我们为之欣喜若狂。但是随着使用场景的增加,我们遇到的问题也越来越多,其中一个经常遇到的问题就是:rebalance(重平衡)问题。
陈树义
2020/05/22
6.7K1
线上Kafka突发rebalance异常,如何快速解决?
从一个消费慢的例子深入理解 kafka rebalance
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 ---- 文章来源:https://lxkaka.wang/kafka-rebalance/ 前 言 消息队列是服务端必不可少的组件,其中Kafka可以说是数一数二的选择,对于大部分服务端的同学来说Kafka也是最熟悉的消息中间件之一。而当我们在生产上遇到kafka的使用问题时想要透过现象看到问题的本质,从而找到解决问题的办法。这就要求对kafka的设计和实现有这较为深刻的认识。在这篇文章里我们就以生产实际的例子来展开讨论Kafka在消费
猿天地
2022/03/04
1.5K0
Kafka又出问题了!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/03/09
7920
kafka常见报错集合-二
Failed to send SASL handshake xxx.xxx.xxx.xxx:port: tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
沐榕樰
2024/03/03
4330
Kafka 重平衡 全流程解析
本文来自 极客时间 Kafka核心技术与实战 这段时间有看 极客时间的这个课程, 这里仅以分享的角度来做个笔记。 那么本文将涉及到以下几个知识点:
solve
2019/10/30
3.7K0
Kafka重平衡机制
重平衡跟消费组紧密相关,它保证了消费组成员分配分区可以做到公平分配,也是消费组模型的实现,消费组模型如下:
张乘辉
2019/09/30
1.3K0
Kafka重平衡机制
面试必问之kafka
快递小哥手上有很多快递需要送,他每次都需要先电话一一确认收货人是否有空、哪个时间段有空,然后再确定好送货的方案。这样完全依赖收货人了!如果快递一多,快递小哥估计的忙疯了……如果有了便利店,快递小哥只需要将同一个小区的快递放在同一个便利店,然后通知收货人来取货就可以了,这时候快递小哥和收货人就实现了解耦!
一笠风雨任生平
2022/01/06
6160
面试必问之kafka
一文理解Kafka重复消费的原因和解决方案
在解释Kafka重复消费出现原因之前,列举一下Kafka中与消费者有关的几个重要配置参数。
全菜工程师小辉
2021/06/25
6.2K0
Kafka组消费之Rebalance机制
《Kafka重要知识点之消费组概念》讲到了kafka的消费组相关的概念,消费组有多个消费者,消费组在消费一个Topic的时候,kafka为了保证消息消费不重不漏,kafka将每个partition唯一性地分配给了消费者。但是如果某个消费组在消费的途中有消费者宕机或者有新的消费者加入的时候那么partition分配就是不公平的,可能导致某些消费者负载特别重,某些消费者又没有负载的情况。Kafka有一种专门的机制处理这种情况,这种机制称为Rebalance机制。
王知无-import_bigdata
2020/09/25
6.3K0
Kafka组消费之Rebalance机制
如何快速全面掌握Kafka?5000字吐血整理
Kafka 是目前主流的分布式消息引擎及流处理平台,经常用做企业的消息总线、实时数据管道,本文挑选了 Kafka 的几个核心话题,帮助大家快速掌握 Kafka,包括:
大数据技术架构
2020/03/13
2.7K0
如何快速全面掌握Kafka?5000字吐血整理
Kafka Consumer
Kafka Consumer消费以组的方式划分,Topic中的每一个分区只会分给同一个组中的其中一个实例。这是基于队列模式,如果想基于发布订阅模式,那订阅同一个Topic的实例需要指定不同的组名。
shysh95
2020/03/31
1.3K0
首页 归档 分类 标签 作者 kafka原理总结
分区策略决定 producer 将消息怎么分发到 partition 中, 分区策略不合适可能导致数据倾斜, 有些时候我们需要实现顺序消息, 也需要将同一业务的消息都发送到同一个 partition 上。生产端将消息发送给 broker 之前主要经过拦截、序列化、分区(Partitioner)几个步骤。分区器主要读取 partition 配置(生产端配置partitioner.class, 默认值是 DefaultPartitioner)
leobhao
2023/03/08
4920
首页  归档  分类  标签  作者     kafka原理总结
Kafka中的再均衡
在《Kafka消费者的使用和原理》中已经提到过“再均衡”的概念,我们先回顾下,一个主题可以有多个分区,而订阅该主题的消费组中可以有多个消费者。每一个分区只能被消费组中的一个消费者消费,可认为每个分区的消费权只属于消费组中的一个消费者。但是世界是变化的,例如消费者会宕机,还有新的消费者会加入,而为了应对这些变化,让分区所属权的分配合理,这都需要对分区所属权进行调整,也就是所谓的“再均衡”。本文将对再均衡的相关知识进行详细叙述。
草捏子
2020/09/28
8920
Kafka中的再均衡
kafka的consumer设计方案
以下特点实现了了kafka的消费者设计思想:基于队列和基于发布/订阅者模式的 生产-消费模型。
mariolu
2020/06/15
1.8K0
一文理解Kafka的选举机制与Rebalance机制
Kafka是一个高性能,高容错,多副本,可复制的分布式消息系统。在整个系统中,涉及到多处选举机制,被不少人搞混,这里总结一下,本篇文章大概会从三个方面来讲解。
全菜工程师小辉
2021/07/23
9.1K0
04 Confluent_Kafka权威指南 第四章: kafka消费者:从kafka读取数据
应用程序通过KafkaConsumer订阅一个topic之后收取数据来完成从kafka的数据读取。从kafka读取数据与从其他消息系统读取数据只有少许不同,几乎没用什么独特的概念。如果不理解这些概念,你将很难使用消费者API。我们首先对一些重要的概念进行解释,然后介绍一些示例,这些示例展示了使用消费者API在不同需求的应用程序中的不同方式。
冬天里的懒猫
2020/08/03
3.8K0
KafkaConsumer-Kafka从入门到精通(十)
上篇文章说了,消息压缩可以看分情况进行,判断下服务器cpu空闲还是io空闲较多,如果cpu空闲较多,则考虑消息积压,反之则不考虑。还有消费者组,consumer group,对于同一个group,只会发送一条消息进入一个实例。位移提交在0.9.0.0版本之前是保存到zookeeper,后来版本是保存在内部topic的__consumer offsets。
keying
2022/12/14
4160
推荐阅读
相关推荐
Ckafka消费者组反复重平衡问题解决之道
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档