首页 > 其他分享 >十六、RocketMQ5.0版本消费负载均衡

十六、RocketMQ5.0版本消费负载均衡

时间:2023-07-29 11:55:34浏览次数:40  
标签:负载 消费者 队列 十六 粒度 消息 均衡 RocketMQ5.0

根据消费者类型的不同,消费者负载均衡策略分为以下两种模式:

  1. 消息粒度负载均衡:RocketMQ5.x版本的PushConsumer和SimpleConsumer默认负载策略

  2. 队列粒度负载均衡:PullConsumer默认负载策略

消息粒度负载均衡

消息粒度负载均衡策略中,同一消费者分组内的多个消费者将按照消息粒度平均分摊主题中的所有消息,即同一个队列中的消息,可被平均分配给多个消费者共同消费。

如上图所示,消费者分组Group A中有三个消费者A1、A2和A3,这三个消费者将共同消费主题中同一队列Queue1中的多条消息。 注意 消息粒度负载均衡策略保证同一个队列的消息可以被多个消费者共同处理,但是该策略使用的消息分配算法结果是随机的,并不能指定消息被哪一个特定的消费者处理。

消息粒度的负载均衡机制,是基于内部的单条消息确认语义实现的。消费者获取某条消息后,服务端会将该消息加锁,保证这条消息对其他消费者不可见,直到该消息消费成功或消费超时。因此,即使多个消费者同时消费同一队列的消息,服务端也可保证消息不会被多个消费者重复消费。

顺序消息负载机制

在顺序消息中,消息的顺序性指的是同一消息组内的多个消息之间的先后顺序。因此,顺序消息场景下,消息粒度负载均衡策略还需要保证同一消息组内的消息,按照服务端存储的先后顺序进行消费。不同消费者处理同一个消息组内的消息时,会严格按照先后顺序锁定消息状态,确保同一消息组的消息串行消费。

如上图所述,队列Queue1中有4条顺序消息,这4条消息属于同一消息组G1,存储顺序由M1到M4。在消费过程中,前面的消息M1、M2被消费者Consumer A1处理时,只要消费状态没有提交,消费者A2是无法并行消费后续的M3、M4消息的,必须等前面的消息提交消费状态后才能消费后面的消息。

特点

相对于队列粒度负载均衡策略,消息粒度负载均衡策略有以下特点:

  • 消费分摊更均衡:对于传统队列级的负载均衡策略,如果队列数量和消费者数量不均衡,则可能会出现部分消费者空闲,或部分消费者处理过多消息的情况。消息粒度负载均衡策略无需关注消费者和队列的相对数量,能够更均匀地分摊消息。

  • 对非对等消费者更友好:在线上生产环境中,由于网络机房分区延迟、消费者物理资源规格不一致等原因,消费者的处理能力可能会不一致,如果按照队列分配消息,则可能出现部分消费者消息堆积、部分消费者空闲的情况。消息粒度负载均衡策略按需分配,消费者处理任务更均衡。

  • 队列分配运维更方便:传统基于绑定队列的负载均衡策略必须保证队列数量大于等于消费者数量,以免产生部分消费者获取不到队列出现空转的情况,而消息粒度负载均衡策略则无需关注队列数。

演示

首先看下PushConsumer类型的消费者。用RocketMQ4.x版本的api发送顺序消息(每条消息指定Message Queue),启动3个RocketMQ5.x的消费者做负载均衡。发送10条消息后:

查看其中一个消费者,发现发送两次消息,同一个消费者消费的消息不同。RocketMQ5.0的PushConsumer消费者负载均衡是基于消息粒度的,不是基于Message Queue粒度的。在试下SimpleConsumer的消费负载均衡,发现和PushConsumer的效果相同。

队列粒度负载均衡

对于历史版本(服务端4.x/3.x版本)的消费者,包括PullConsumer、DefaultPushConsumer、DefaultPullConsumer、LitePullConsumer等,默认且仅能使用队列粒度负载均衡策略。

原理

队列粒度负载均衡策略中,同一消费者分组内的多个消费者将按照队列粒度消费消息,即每个队列仅被一个消费者消费。

如上图所示,主题中的三个队列Queue1、Queue2、Queue3被分配给消费者分组中的两个消费者,每个队列只能分配给一个消费者消费,该示例中由于队列数大于消费者数,因此,消费者A2被分配了两个队列。若队列数小于消费者数量,可能会出现部分消费者无绑定队列的情况。

队列粒度的负载均衡,基于队列数量、消费者数量等运行数据进行统一的算法分配,将每个队列绑定到特定的消费者,然后每个消费者按照取消息>提交消费位点>持久化消费位点的消费语义处理消息,取消息过程不提交消费状态,因此,为了避免消息被多个消费者重复消费,每个队列仅支持被一个消费者消费。

特点

相对于消息粒度负载均衡策略,队列粒度负载均衡策略分配粒度较大,不够灵活。但该策略在流式处理场景下有天然优势,能够保证同一队列的消息被相同的消费者处理,对于批量处理、聚合处理更友好。

标签:负载,消费者,队列,十六,粒度,消息,均衡,RocketMQ5.0
From: https://www.cnblogs.com/shigongp/p/17589040.html

相关文章

  • VMware vSphere 8.0 Update 1c 正式版发布 - 企业级工作负载平台
    VMwarevSphere8.0Update1c正式版发布-企业级工作负载平台ESXi8.0U1&vCenterServer8.0U1请访问原文链接:https://sysin.org/blog/vmware-vsphere-8-u1/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2023-07-27,VMwarevSphere8.0U1c发布。企业级工......
  • Veeam Backup & Replication v12 (2023年7月更新版) - 面向所有工作负载的备份软件
    VeeamBackup&Replicationv12(2023年7月更新版)-面向所有工作负载的备份软件VeeamAvailabilitySuitev12请访问原文链接:https://sysin.org/blog/veeam-backup-12/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全球首屈一指的备份和恢复提供商管理、控制......
  • VMware NSX Advanced Load Balancer (NSX ALB) 22.1.4 - 负载均衡平台
    VMwareNSXAdvancedLoadBalancer(NSXALB)22.1.4-负载均衡平台请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-22/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台NSXAdvancedLoadBalancerNSXAdvancedLoadBalancer(Avi)可简化应......
  • # 实验十六
    实验十六题目:本次实验任务:安装一个新的int7CH中断例程,为显示输出提供如下功能子程序。(1)清屏;(2)设置前景色;(3)设置后景色;(4)向上滚动一行。入口参数说明如下。(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;(2)对于1、2号功能,用al传送颜色值,a......
  • SpringBoot实践(十六):mark一个开源商品网站
    特点:前后端分离,vue框架,包含小程序、APP,界面风格类似小米商城;外贸网站源码:CRMEB官网-开源会员管理电商营销系统,助力企业发展!特点:thinkphp,待研究;......
  • linux nginx 简单负载均衡 和多端口配置
    nginx负载均衡配置##Nginx需要访问linux文件系统,必须有文件系统的权限。Userroot代表nginx访问文件系统的权限是root用户权限。如果不开启权限,可能有404访问错误userroot;worker_processes1;events{worker_connections1024;}http{includem......
  • nginx 负载均衡
    nginx配置:worker_processes1;events{worker_connections1024;}http{server{listen8081;location/{root/data/xc1;}}server{listen8082;location/{root/data/xc2;}}server{list......
  • C语言中的二进制数、八进制数和十六进制数
    C语言是一门使用数字的编程语言,其中包括了8进制和16进制的数字表示方法。这两种表示方法都可以用于整数和字符类型。8进制表示法8进制数字以数字0(零)和前缀0开头表示。例如,八进制数012表示为十进制的10。以下是一些示例:intx=012;//八进制的12,等价于十进制的10inty=0......
  • 七月二十六日总结
    早上6点起来洗漱吃饭去参加驾照科目一考试第一次机会。中午吃晚饭去参加科目一考试第二次机会,然后回家写大道至简读后感,学习java晚上吃完晚饭洗漱,准备睡觉。今天读后感写了一部分,明天继续,同时康复训练。保持早睡,养成良好的作息习惯。......
  • 软件测试|超好用超简单的Python GUI库——tkinter(十六)
    前言我们在使用各种软件时,菜单是我们最常用的功能之一,菜单以可视化的方式将一系列的“功能选项卡”进行分组,并在每个分组下又“隐藏”了许多其他的“选项卡”。当打开菜单时,这些选项卡就会“显式”的呈现出来,方便用户进行选择,比如我们常用的QQ音乐播放器,如下图:tkinter同样给我......