kafka 一步步探究消费者组与分区分配策略

news2024/11/13 15:18:47

本期主要聊聊kafka消费者组与分区

消费者组 & 消费者

图片

每个消费者都需要归属每个消费者组,每个分区只能被消费者组中一个消费者消费

上面这段话还不够直观,我们举个例子来说明。

  • 订单系统 订单消息通过 order_topic 发送,该topic 有 5个分区

  • 结算系统 订阅订单变更消息订阅订单的消息,进行相关结算业务,结算系统的消费者组是order_consumer_settlement

    • 结算系统有三台服务器,所有消费者组是order_consumer_settlement有三个消费者,由于每个分区被不同消费者(服务器)处理,所以消息不会被不同结算服务节点重复消费,且每条消息都有一个唯一的机器处理结算

  • 审计系统 也订阅订单变更消息,它的消费者组是order_consumer_audit ,审计系统部署2台,它的消息处理与结算系统之间毫不相干。

如果订单系统发送一条订单变更消息,该消息所在分区是确定的,结算系统的一个服务节点会消费到这条消息,审计系统的一个服务节点也会消费到该消息。

通常情况下我们一个 应用 对应某个Topic 的 消费者组,该应用的每个服务节点都对应一个消费者。

按照应用对应消费者组方式,一条消息有且只有一个服务节点处理,在排除配置和一些特殊情况,消息不会重复消息,也不会丢失

消费者分区与主题数量关系

可以在日志中grep Adding newly assigned partition关键字查看当前服务节点分配的分区

图片

不同数量消费者分区情况

  • 分区数量为10 ,消费者组有2个节点

    • 消费者分配到的分区是 5、5

  • 分区数量为10 ,消费者组有3个节点

    • 消费者分配到的分区是 4、3、3

  • 分区数量为10 ,消费者组有4个节点

    • 消费者分配到的分区是 3、2、2、3

  • 分区数量为10 ,消费者组有5个节点

    • 消费者分配到的分区是 2、2、2、2、2

从上面数据看每个消费者分配的分区数量是均匀的

举一反三

如果 分区数量 小于 消费者数量,猜测会有消费者一个分区也分配不到测试分区数量为3 , 消费者数量为4 时。下面日志证明结论正确的

图片

刨根到底,分区分配策略如何调整

前面都是默认情况下,分区配置策略,不同版本默认策略是不同的,通过partition.assignment.strategy 配置,常见分配策略有

RangeAssignor

  • RangeAssignor策略对每个Topic进行独立的分区分配

  • 分区按照分区ID进行排序,然后订阅这个Topic的消费组的消费者再进行排序

  • 分配时尽量均衡地将分区分配给消费者

缺点只保证单个主题情况下均匀分配,对于消费者同时订阅多个主题情况下可能会造成 总体分区分配不合理。

RoundRobinAssignor

  • 所有消费者和所有分区都进行排序,然后按照轮询的方式将分区分配给消费者

该策略在RangeAssignor进行了优化,当然如果消费者订阅的主题列表不同情况下分配结果也是不均匀的。

StickyAssignor

它在RangeAssignor的基础上引入了“粘性”的限制。当消费者组中消费者离开或加入,尽量保留现有的分配结果,并使新的分配结果均衡。

CooperativeStickyAssignor

它是Kafka 2.4.0 引入的一种新的分配策略。它将原来的一次全局分区重平衡改为多次小规模分区重平衡。这种策略能够更平滑地处理消费者加入或离开的情况,减少因全局重平衡带来的性能开销。

How 修改默认策略 ?

参考下面代码设置ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG 甚至可以自定义策略

   private Properties getConfig() {
        Properties properties = new Properties();
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "xxxx:9092");
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());
        properties.put(ConsumerConfig.GROUP_ID_CONFIG,consumerGroup);
        properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,Arrays.asList(RangeAssignor.class.getName()))
        return properties;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cursor免费 GPT-4 IDE 工具的保姆级使用教程

Cursor免费 GPT-4 IDE 工具的保姆级使用教程 简介 Cursor 是一款基于人工智能技术的代码生成工具。 它利用先进的自然语言处理和深度学习算法,可根据用户的输入或需求,自动生成高质量代码。 不管是初学者,还是资深开发者,Curs…

网络爬虫到底难在哪里?

如果你是自己做爬虫脚本开发,那确实难,因为你需要掌握Python、HTML、JS、xpath、database等技术,而且还要处理反爬、动态网页、逆向等情况,不然压根不知道怎么去写代码,这些技术和经验储备起码得要个三五年。 比如这几…

Qt5详细安装教程(包含导入pycharm)

1.自行下载Qt 2.双击进行安装 3.设置完成后勾选接受,跳转下一步 4.可选择安装位置,比较习惯安装在D盘 5.根据需求勾选对应组件安装 6.安装完成后,打开pycharm,进入settings—>选择ExternalTools,根据以下步骤进行配…

python怎么读json文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…

将flux1画图API封装为Dify工作流

本文主要介绍将公开的 flux1 画图 API(https://api-flux1.api4gpt.com/)封装为 Dify 工作流。 1.构建工作流 新建一个"聊天助手-> 工作流编排"的"flux1 工作流": 总共使用了开始、HTTP 请求和直接回复 3 个节点。如…

【2025】基于微信小程序的网上点餐系统设计与实现、基于微信小程序的智能网上点餐系统、微信小程序点餐系统设计、智能点餐系统开发、微信小程序网上点餐平台设计

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

根据 IP 地址进行 VPN 分流(详细,亲测,通用)

根据 IP 地址进行 VPN 分流(详细,亲测,通用) 背景 不在学校的时候需要使用实验室的服务器,但是实验室的服务器只能在校园网内访问,因此在校外就需要使用学校的 VPN,但是打开 VPN 以后会默认将…

除了 SEO 之外,HTML 语义化还有什么用?

每次碰到 HTML 语义化的话题,几乎 99% 的前端都会想到 SEO。那除了 SEO,你还会想到什么呢?好像没有了。。。 确实,当我们要做 SEO 的时候,往往第一时间都会想到优化 HTML 语义化,久而久之,大家…

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看,已在正式环境部署验证,流程无问题! 所用系统为国产化麒麟银河 aarch64系统,部署时间2024年9月份! #查看服务器信息 #涉及生产服务器,所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…

【Delphi】实现接收系统拖动文件

在 Delphi 中,可以通过以下步骤来实现将文件夹中的文件拖动到 Form 上,并在拖动时显示文件类型的光标。我们可以利用 VCL 中的 Drag and Drop 机制来处理拖动操作,以及自定义光标显示。 以下是详细的步骤和代码示例: 实现步骤&a…

MATLAB系列05:自定义函数

MATLAB系列05:自定义函数 5. 自定义函数5.1 MATLAB函数简介5.2 在MATLAB中传递变量:按值传递机制5.3 选择性参数5.4 用全局内存分享数据5.5 在函数两次调用之间本地数据的存储5.6 函数的函数(function functions)5.7 子函数和私有函数5.8 总结 5. 自定义…

问题:WINCC 7.5 结构变量只能是内部变量吗?

问题:WINCC 7.5 结构变量只能是内部变量吗? 答案:不是的呢,你创建结构的时候可以选择外部变量的 如图:工控人加入PLC工业自动化精英社群 #WINCC 7.5##变量##结构##西门子工业支持中心#

css五种定位总结

在 CSS 中,定位(Positioning)主要有五种模式,每种模式的行为和特点不同,以下是 static、relative、absolute、fixed 和 sticky 五种定位方式的对比总结: 1. static(默认定位) 特性…

基于SpringBoot+Vue+MySQL的在线招投标系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今商业环境中,招投标活动是企业获取项目、资源及合作伙伴的重要途径。然而,传统招投标过程往往繁琐复杂,涉及众多文件交换、信息审核与沟通环节,不仅效率低下,还易…

【强化学习系列】Gym库使用——创建自己的强化学习环境2:拆解官方标准模型源码/规范自定义类+打包自定义环境

目录 一、 官方标准环境的获取与理解 二、根据官方环境源码修改自定义 1.初始化__init__() 2.重置环境 reset() 三、打包环境 1.注册与创建自定义环境 2.环境规范化 在本文的早些时候,曾尝试按照自己的想法搭建自定义的基于gym强化学习环境。 【强化学习系列】Gy…

什么是自然语言处理

自然语言处理(Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究的是如何实现人与计算机之间使用自然语言进行有效通信的各种理论和方法。以下是关于自然语言处理的详细解释: 一、定义与概述 定义&…

字符编码发展史2 — ISO-8859-N

2.2. 第二个阶段 本地化 2.2.1. ANSI2.2.2. ISO/IEC 8859-N 2.2.2.1. 什么是ISO/IEC 8859-N?2.2.2.2. ISO 8859-1的编码表 上一篇《字符编码发展史1 — ASCII和EASCII》我们讲解了字符编码的起源ASCII和EASCII。本篇我们将继续讲解字符编码的第二个发展阶段中的ISO 8859-N。…

西门子200SMART全面讲解

200 SMART 全面讲解工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群