初探RocketMQ消息消费原理(一)

news/2025/2/22 2:40:27/文章来源:https://www.cnblogs.com/likeguang/p/18573938

目录
  • 一. 消息消费概述
  • 二、消费队列负载机制与重平衡
    • 1.1 消费队列负载机制与重平衡
    • 1.2 并发消费模型
    • 1.3 消息消费进度反馈机制

一. 消息消费概述

消息消费以组的模式开展,一个消费组可以包含多个消费者,每个消费组可以订阅多个主题(一般来说不建议),消费组之间有集群模式和广播模式两种消费模式。集群模式是当前主题下的同一条消息只允许被其中一个消费者消费。广播模式是当前主题下的同一条消息将被集群内的所有消费者消费一次。

消息服务器与消费者之间的消息传送也有两种方式:推模式和拉模式。所谓的拉模式,是消费端主动发起拉取消息的请求,而推模式是消息到达消息服务器后,再推送给消息消费者。RocketMQ消息推模式基于拉模式实现,在拉模式上包装一层,一个拉取任务完成后开始下一个拉取任务。服务端缓存请求,当消息来临之后,会从缓存中查询是否有对应的拉去请求,如果有进行推送。

集群模式下,多个消费者如何对消息队列进行负载呢?消息队列负载机制遵循一个通用的思想:一个消息队列同一时间只允许被一个消费者消费,一个消费者可以消费多个消息队列。

RocketMQ 支持局部顺序消息消费,也就是保证同一个消息队列上的消息按顺序消费。不支持消息全局顺序消费,如果要实现某一主题的全局顺序消息消费,可以将该主题的队列数设置为1,牺牲高可用性。RocketMQ支持两种消息过滤模式:表达式(TAG、SQL92)与类过滤模式。

消息拉模式主要是由客户端手动调用消息拉取API,而消息推模式是消息服务器主动将消息推送到消息消费端,本章将以推模式为突破 口,重点介绍 RocketMQ 消息消费的实现原理。

二、消费队列负载机制与重平衡

1.1 消费队列负载机制与重平衡

正如上文提到的,RocketMQ提供了两种消费模式,集群模式与广播模式。广播模式中所有的消费者会消费全部的队列,故没有所谓的消费队列负载问题,而集群模式下需要考虑同一个消费组内的多个消费者之间如何分配队列。

RocketMQ提供了多种队列负载算法,其中比较常用的是AVGAVG_BY_CIRCLE这两种平均分配算法,例如8个队列分别为b1_q0、 b1_q1、b1_q2、b1_q3、b2_q0、b2_q1、b2_q2、b2_q3,一个消费组有 3个消费者,分别用C1、C2、C3表示。

采用AVG的分配机制,各个消费者分配到的队列如下。

  • c1:b1_q0、b1_q1、b1_q2
  • c2:b1_q3、b2_q0、b2_q1
  • c3:b2_q2、b2_q3

采用AVG_BY_CIRCLE的分配机制,各个消费者分配到的队列如下。

  • c1:b1_q0、b1_q3、b2_q2
  • c2:b1_q1、b2_q0 b2_q3
  • c3:b1_q2、b2_q1

这两种分配算法各有使用场景。通常要求发送方发送的消息尽量在各个队列上分布均匀,如果分布均衡,就会使用第一种平均算法。但有些时候,一台Broker上的消息会明显多于第二台,如果使用第一种分配算法,c1消费者处理的消息就太多了,但其他消费者又空闲, 而且还不能通过增加消费者来改变这种情况,此种情况使用AVG_BY_CIRCLE方式更加合适。

在消费时间过程中可能会遇到消息消费队列增加或减少、消息消费者增加或减少,比如需要对消息消费队列进行重新平衡,即重新分配,这就是所谓的重平衡机制。在RocketMQ中,每隔20s会根据当前队列数量、消费者数量重新进行队列负载计算,如果计算出来的结果与当前不一样,则触发消息消费队列的重平衡。

1.2 并发消费模型

RocketMQ 支持并发消费与顺序消费两种消费方式,消息的拉取与消费模型基本一致,只是顺序消费在某些环节为了保证顺序性,需要引入锁机制,RocketMQ的消息拉取与消费模式如图下图所示:

一个MQ客户端(MQClientInstance)只会创建一个消息拉取服务线程(PullMessageService)向Broker拉取消息,但是拉取消息网络IO操作是异步的,所以在拉取一个消费队列消息时发生长轮询阻塞并不会影响其它消费队列的消息拉取。PullMessageService会不断获取PullRequest拉取请求,将拉取请求放入IO线程池中后会立即返回(不会等Broker响应),然后继续“不知疲倦”地获取下一个PullRequest拉取请求。当IO线程收到broker相应后,会执行回调方法,将拉取到的消息提交到消费组的线程池。

RocketMQ客户端为每一个消费组创建独立的消费线程池,即在并发消费模式下,单个消费组内的并发度为线程池线程个数。线程池处理一批消息后会向Broker汇报消息消费进度。

1.3 消息消费进度反馈机制

RocketMQ客户端消费一批数据后,需要向Broker反馈消息的消费进度,Broker会记录消息消费进度,这样在客户端重启或队列重平衡时会根据其消费进度重新向Broker拉取消息,消息消费进度反馈机制,如下图所示:

再来思考一个问题,假设线程池中有T1、T2、T3三个线程,此时分别依次获取到msg1、msg2、msg3消息,消息msg3的偏移量大于msg1、msg2的偏移量,由于支持并发消费,如果线程t3先处理完msg3,而t1、t2还未处理,那么线程t3如何提交消费偏移量呢?

试想一下,如果提交msg3的偏移量是作为消费进度被提交,如果此时消费端重启,消息消费msg1、msg2就不会再被消费,这样就会造成“消息丢失”。因此t3线程并不会提交msg3的偏移量,而是提交线程池中偏移量最小的消息的偏移量,即t3线程在消费完msg3后,提交的消息消费进度依然是msg1的偏移量,这样能避免消息丢失,但同样有消息重复消费的风险。(所以这里RocketMQ在官方中提出了一个概念:At least Once,消息至少会被投递一次。所以需要手动保障防重)

参考:

RocketMQ详解(一)原理概览

深入剖析RocketMQ消息消费原理

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rust中使用opencv-cuda和yolov

最近公司有个要识别的项目需要计算机识别,于是就找到了opencv来进行,opencv的cuda版本需要自己来进行编译需要去opencv官网下载,我下载的版本是opencv4.10 https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip 还有需要opencv_contrib-4.10.0和cmake下载 下载之…

rust中使用opencv和cuda

最近公司有个要识别的项目需要计算机识别,于是就找到了opencv来进行,opencv的cuda版本需要自己来进行编译需要去opencv官网下载,我下载的版本是opencv4.10 https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip 还有需要opencv_contrib-4.10.0和cmake下载 下载之…

视效升级如此简单?零代码实现炫酷管道效果

三维场景视效升级 通过添加管道效果,可以提升整个三维场景的辨识度,尤其是在需要表现水流流向、能源运输、移动路径等场景中。通过设置管道效果,不仅能够清晰表达设计思路,还能为整个场景增添一抹亮色。下面我们就一起来看一下,如何在山海鲸可视化中添加管道效果。1. 管道…

CudaSPONGE之Python接口

本文介绍了高性能GPU分子动力学模拟软件CudaSPONGE的Python API接口,通过官方开发的prips插件,使得我们可以在Python框架下很方便的开发一些分子动力学模拟的Force Wrapper,例如Meta Dynamics中就有很多可以外界的工具,非常方便开发者的二次开发,同时又能够兼顾到性能。技…

行业专家推荐2024年CRM系统Top 5

商业环境瞬息万变,客户关系管理(CRM)系统帮助企业更好地连接客户、理解客户、服务客户,已成为企业不可或缺的战略资产。 企业在选择CRM系统时,应做好充分的市场调查。为了帮助企业更好地把握市场机遇,提升客户体验,本文根据搜索结果和行业专家的评价,推荐2024年各方面排…

论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks》

发表时间:2019期刊会议:IEEE Symposium on Security and Privacy (S&P)论文单位:UC Santa Barbara论文作者:Bolun Wang, Yuanshun Yao, Shawn Shan, Huiying Li, Bimal Viswanath, Haitao Zheng, Ben Y. Zhao方向分类:Backdoor Attack论文链接开源代码摘要 深度神经网…

TIA下梯形图做单灰仓脉冲阀喷吹控制练习

假设有这样一个应用需求,一个会仓,上面有10个脉冲阀,按照顺序进行喷吹,每个阀喷吹后,间隔一定时间下一个阀喷吹,可以设置总的喷吹次数,达到次数后停止喷吹,如果总喷吹次数设置为0,那么就一直喷吹下去。如果点击了开始按钮开始喷吹动作,再次点击开始按钮,不会重新开始…

如何提升日用品行业生产效率?数字化管理成关键

在日用品行业,快速反应和高效生产是生存之道。从采购、生产到物流配送,每一个环节都充满挑战。市场需求瞬息万变,交付周期日益缩短,任何一个环节的滞后都可能导致整个供应链的断裂。如何在繁忙的工作中保持高效协作、精准调度,并确保及时交付,是许多企业迫切需要解决的问…

从需求到交付,如何有效控制客户的预期?

在现代企业管理中,客户预期的管理是项目成功的关键因素之一。无论是软件开发、产品设计还是咨询服务,项目能否成功完成往往取决于客户对于项目成果的预期。如果没有正确的预期管理,客户的需求与项目交付之间就容易产生偏差,进而影响客户的满意度和项目的最终成果。因此,如…

PIDNet-PagFM-特征融合

import torch.nn as nn import torch import torch.nn.functional as F class PagFM(nn.Module):# 选择性特征融合 直接融合细节和低频上下文 容易导致细节丢失def __init__(self, in_channels, mid_channels, after_relu=False, with_channel=False, BatchNorm=nn.BatchNorm2…

基于改进自适应分段线性近似(IAPLA)的微分方程数值解法研究: 从简单动力系统到混沌系统的应用分析

微分方程作为一种数学工具在物理学、金融学等诸多领域的动态系统建模中发挥着关键作用。对这类方程数值解的研究一直是学术界关注的重点。 数值方法是一类用于求解难以或无法获得解析解的数学问题的算法集合。这类方法主要处理描述函数在时间或空间维度上演化的微分方程,采用逐…

大模型--QLoRA、GPTQ:模型量化02--24

目录1. 参考2. 量化简介3. QLoRANF4 数据类型4. GPTQOBD:Optimal Brain DamageOBS:Optimal Brain SurgeonOBCGPTQ 的创新点5 各大开源模型量化实现6 后续方向探讨 1. 参考 https://zhuanlan.zhihu.com/p/646210009?utm_psn=1845389883864133633 2. 量化简介 模型量化是将浮点…