当前位置: 首页 > news >正文

RocketMQ中的顺序消息和乱序消息详解

内容编辑中…

1.背景

顺序消息是消息队列 RocketMQ 提供的一种高级消息类型。

对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费。

即先发送的消息先消费,后发送的消息后消费。

顺序消息在发送、存储和投递的处理过程中,强调多条消息间的先后顺序关系。RocketMQ 顺序消息的顺序关系通过消息组(MessageGroup)判定和识别,发送顺序消息时需要为每条消息设置归属的消息组,相同消息组的多条消息之间遵循先进先出的顺序关系,不同消息组、无消息组的消息之间不涉及顺序性。

2.顺序消息的特性

1、消息消费失败或消费超时,会触发服务端重试逻辑,重试消息属于新的消息,原消息的生命周期已结束;

2、顺序消息消费失败进行消费重试时,为保障消息的顺序性,后续消息不可被消费,必须等待前面的消息消费完成后才能被处理。

3、顺序消息仅支持使用MessageType为FIFO的主题,即顺序消息只能发送至类型为顺序消息的主题中,发送的消息的类型必须和主题的类型一致。

3.顺序消息 VS 普通消息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

顺序消息普通消息
原子性消息之间存在偏序关系消息之间没有关联关系
顺序性严格有序大致有序
扩展性具备一定的可拓展性可拓展性强
吞吐受到消息队列数量限制,容易导致消息积压
并发单元同一MessageGroup的消息单条消息
编码要求相对较高

4.应用场景

RocketMQ 的顺序消费(也称为有序消息或顺序消息)在某些业务场景中是至关重要的,特别是在那些对消息处理顺序有严格要求的情况下。以下是几种会用到顺序消费的典型场景:

金融交易:例如,在处理用户的账户余额更新时,所有与该用户账户相关的操作必须按照发生的顺序进行处理。如果先处理了取款消息而后处理存款消息,可能会导致用户的账户余额出现错误。
订单处理系统:在一个电商环境中,从下单、支付到发货等步骤都需要保证按顺序执行。比如,不能在订单未创建之前就进行支付确认,也不能在未支付之前就开始发货。
工作流管理:当业务逻辑涉及多个步骤并且这些步骤之间存在依赖关系时,确保每个任务按照正确的顺序被执行是非常重要的。例如,文档审批流程可能需要依次通过不同级别的审核人员。
实时数据分析和日志处理:对于一些需要根据事件发生的时间序列来进行分析的应用来说,保持数据摄入的顺序性可以简化下游处理逻辑并提高准确性。
库存管理系统:产品入库、出库等操作也需要遵循一定的顺序,以确保库存数量的准确性。
为了实现顺序消费,RocketMQ 提供了两种类型的顺序消息:全局顺序和分区顺序

5.全局顺序和分区顺序

5.1 全局有序

可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费。

从而保证消息的全局有序,但是这种方式效率低,一般不使用。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.2 分区有序

在同一 Topic 下的不同分区(Queue)之间不保证顺序,但在同一分区内的消息则保持严格的顺序。

假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID。

比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID。
在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
这样同一个订单的数据就可以保证发送到一个消息队列中。
消费者端使用MessageListenerOrderly处理有序消息。

这就是RocketMQ的局部有序,保证消息在某个消息队列中有序
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在实际应用中,通常会选择分区顺序而非全局顺序,因为后者可能导致性能瓶颈(所有的消息都要经过同一个队列),而前者可以在一定程度上平衡顺序性和吞吐量。

为了确保顺序消费的有效性,RocketMQ 使用了特定的消息发送策略(如基于哈希值选择相同的 MessageQueue)以及特殊的消费者监听器(MessageListenerOrderly),它会在消费端加锁以确保同一队列中的消息被单线程顺序处理。

此外,顺序消息不适合使用广播模式,并且建议不要异步发送这类消息,以免破坏其顺序性。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
下面用订单进行分区有序的示例。

5.3 分区有序示例

一个订单的顺序流程是:创建、付款、推送、完成。订单号相同的消息会被先后发送到同一个队列中,消费时,同一个 Orderld 获取到的肯定是同一个队列。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.顺序消费的条件

需要注意的是 RocketMQ 消息的顺序性分为两部分,生产顺序性和消费顺序性。只有同时满足了生产顺序性和消费顺序性才能达到上述的FIFO效果。

6.1 生产顺序性

在分布式环境下,保证消息的全局顺序性是十分困难的,例如两个 RocketMQ Producer A 与 Producer B,它们在没有沟通的情况下各自向 RocketMQ 服务端发送消息 a 和消息 b,由于分布式系统的限制,我们无法保证 a 和 b 的顺序。

因此业界消息系统通常保证的是分区的顺序性,即保证带有同一属性的消息的顺序,我们将该属性称之为 MessageGroup。如图所示,ProducerA 发送了 MessageGroup 属性为 A 的两条消息 A1,A2 和 MessageGroup 属性为 B 的 B1,B2,而 ProducerB 发送了 MessageGroup 属性为 C 的两条属性 C1,C2。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
同时,对于同一 MessageGroup,为了保证其发送顺序的先后性,比较简单的做法是构造一个单线程的场景,即不同的 MessageGroup 由不同的 Producer 负责,并且对于每一个 Producer 而言,顺序消息是同步发送的。同步发送的好处是显而易见的,在客户端得到上一条消息的发送结果后再发送下一条,即能准确保证发送顺序,若使用异步发送或多线程则很难保证这一点。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
我们简单总结一下顺序发送
RocketMQ 通过生产者和服务端的协议保障单个生产者串行地发送消息,并按序存储和持久化。如需保证消息生产的顺序性,则必须满足以下条件:

  • 单一生产者: 消息生产的顺序性仅支持单一生产者,不同生产者分布在不同的系统&#x

相关文章:

RocketMQ中的顺序消息和乱序消息详解

内容编辑中… 1.背景 顺序消息是消息队列 RocketMQ 提供的一种高级消息类型。 对于一个指定的Topic,消息严格按照先进先出(FIFO)的原则进行消息发布和消费。 即先发送的消息先消费,后发送的消息后消费。 顺序消息在发送、存储和投递的处理过程中,强调多条消息间的先后…...

Unity UGUI图片循环列表插件

效果展示: 下载链接:https://gf.bilibili.com/item/detail/1111843026 概述: LoopListView2 是一个与 UGUI ScrollRect 相同的游戏对象的组件。它可以帮助 UGUI ScrollRect 以高效率和节省内存的方式支持任意数量的项目。 对于具有10,000个…...

Kafka系列教程 - Kafka 生产者 -2

1. 生产者简介 不管是把 Kafka 作为消息队列系统、还是数据存储平台,总是需要一个可以向 Kafka 写入数据的生产者和一个可以从 Kafka 读取数据的消费者,或者是一个兼具两种角色的应用程序。 使用 Kafka 的场景很多,诉求也各有不同&#xff…...

AI Chat API 对接说明

AI Chat API 对接说明 我们知道,市面上一些问答 API 的对接还是相对没那么容易的,比如说 OpenAI 的 Chat Completions API,它有一个 messages 字段,如果要完成连续对话,需要我们把所有的上下文历史全部传递&#xff0…...

Thread线程基础使用

多线程目的:其实就是希望“并行”执行多任务,提升效率。 单核多线程基于时间片轮询 并发而非并行 线程最大数等于cpu核心数为佳 namespace thinger.ThreadDemo {class Program{//主线程static void Main(string[] args){Console.WriteLine("这个…...

【Linux】结构化命令

结构化命令structured command:允许脚本根据条件跳过部分命令,改变执行流程。 1、if-then语句 格式1: if command then commands fi 格式2: if command; then commands fi 运行if之后的command命令,如果它的退出状态码…...

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack (1)简介 官网地址:https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称,包含三大基础组件,分别是Elasticsearch、Logstash、Kibana。但实际…...

docker xxxx is using its referenced image ea06665f255d

Error response from daemon: conflict: unable to remove repository reference “registrxxxxxx” (must force) - container 9642fd1fd4a0 is using its referenced image ea06665f255d 这个错误表明你尝试删除的镜像正在被一个容器使用,因此无法删除。要解决这…...

Vue 2 中 v-text 和 v-html 指令的使用详解

目录 Vue 2 中 v-text 和 v-html 指令的使用详解 v-text 指令 简介 基本语法 示例 1:基础用法 特点 v-html 指令 简介 基本语法 示例 2:基础用法 注意事项 区别与选择指南 何时使用 最佳实践 Vue 2 中 v-text 和 v-html 指令的使用详解 V…...

高级Python游戏开发:创建一款多人对战坦克大战

在本教程中,我们将用Python的Pygame库开发一款高级的坦克大战游戏。这款游戏支持多人对战、碰撞检测、子弹射击以及地图障碍生成,适合作为学习Python高级游戏开发的练习项目。 一、游戏功能概述 多人对战模式:玩家可以操作坦克,在同一屏幕上互相攻击。子弹射击:坦克可以发…...

数据结构_拓扑排序

拓扑排序 (所有点按照先后顺序排序) 1.先找到入度为0的点,记录之后,删除这个点和它的出边; 2.若有两个可选,随便选择一个 例 a的入度为0,选a [a] 随便选一个 [a,e] 再找入度为0的点 再选c 最后选d 拓…...

Edge SCDN 边缘安全加速有什么用?

Edge SCDN是最新推出的边缘安全加速服务,它是一种融合了安全防护和内容分发加速功能的网络服务技术,通过在网络边缘部署服务器节点,来优化内容的传输和用户的访问体验,同时保障网络安全。 抵御 DDoS 攻击: Edge SCDN …...

被狗咬住怎么让它松口?

当遭遇狗咬住的惊险状况,保持冷静是首要原则,慌乱只会让事态愈发糟糕。因为狗能敏锐感知人类的情绪,你的镇定能避免它因你的恐惧而愈发兴奋或紧张。 切勿盲目地用力拉扯被咬住的部位。狗的咬合力颇为强大,强行拉扯可能致使伤口撕裂…...

MySQL迁移SQLite 借助PYTHON脚本

使用 Python 脚本将 MySQL 数据库迁移到 SQLite 是一种灵活且强大的方法。 下面是一个基本的脚本示例,使用 pandas 和 sqlite3 库来实现这一过程。 这个脚本假设你已经安装了 pandas 和 mysql-connector-python 库。 步骤 安装必要的库: 如果尚未安装&#xff…...

Python什么是动态调用方法?What is Dynamic Method Invocation? (中英双语)

什么是动态调用方法? 动态调用方法指通过方法或属性的名称,在运行时而非编译时调用对象的方法或访问其属性。换句话说,在编写代码时,方法名或属性名可以是变量,只有在程序运行时才能确定调用的内容。这种特性允许程序…...

Cesium中实现仿ArcGIS三维的动态图层加载方式

Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题: 请求量大,…...

数据冒险、控制冒险、结构冒险

计算机组成原理 数据冒险、控制冒险、结构冒险 对所有用户(所有程序员)可见:PSW、PC、通用寄存器 PSW(条件转移需要用到,程序员使用CMP指令的时候也需要用到所以是对用户可见)PC(跳转指令需要…...

TCA9555芯片手册解读(6)

接前一篇文章:TCA9555芯片手册解读(5) 二、详述 7. 上电复位 当电源(从0V)施加到VCC时,内部通电复位将TCA9555保持在复位状态,直到VCC达到VPOR。此时,重启条件被释放,T…...

NodeJs-fs模块

fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块, fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,内容的写入读取等以及文件夹相关操作 写入文件 异步写入 // 导入fs模块const f…...

Transformer: Attention Is All You Need (2017) 翻译

论文:Attention Is All You Need 下载地址如下: download: Transformer Attention Is All you need Attention Is All You Need 中文 《Attention Is All You Need》是《Transformer》模型的开创性论文,提出了一种全新的基于注意力机制的架构&#xf…...

【深度学习-Day 24】过拟合与欠拟合:深入解析模型泛化能力的核心挑战

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

动静态库的使用(Linux)

1.库 通俗来说,库就是现有的,可复用的代码,例如:在C/C语言编译时,就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好,仓颉语言商城应用的开发进程已经过半,不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面: 看到这个页面,我们首先要对它简单的分析一下。这个页面一共分为三部分,分别是…...

几种简单的排序算法(C语言)

目录 1 简介 2 冒泡排序 2.1 基本思路 2.2 代码实现 3 选择排序 3.1 基本思路 3.2 代码实现 4 插入排序 4.1 基本思路 4.2 代码实现 5 快速排序 5.1 基本思路 5.2 代码实现 6 归并排序 6.1 基本思路 6.2 代码实现 7 基数排序 7.1 基本思路 7.2 代码实现 8 …...

多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案

一、技术优势与适配性分析 1. 任务分工的合理性 YOLO(目标检测) 核心价值:快速定位工业开关在图像中的位置(边界框),为后续分割和分类提供ROI(感兴趣区域)。工业场景适配性&#xf…...

【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)

蓝牙Beacon定位精度优化:KF、EKF与UKF卡尔曼滤波算法详解 标签:蓝牙定位|Beacon|卡尔曼滤波|UKF|EKF|RSSI|室内定位|滤波算法|精度优化 相关分享:…...

60天python训练计划----day45

DAY 45 Tensorboard使用介绍 知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 之前的内容中,我们在神经网络训练中,为了帮助自己理解,借用了很多的组件&#x…...

吃透 Golang 基础:数据结构之 Map

文章目录 Map概述初始化删除访问不存在的 key 返回 value 的零值遍历 mapmap 自身的零值map 索引时返回的第二个参数使用 map 实现 set Map Hash Map 是无序的 key/value 对集合,其中所有的 key 都是不同的。通过给定的 key 可以在常数时间复杂度内完成检索、更新或…...

探索未知惊喜,盲盒抽卡机小程序系统开发新启航

在消费市场不断追求新鲜感与惊喜体验的当下,盲盒抽卡机以其独特的魅力,迅速成为众多消费者热衷的娱乐与消费方式。我们紧跟这一潮流趋势,专注于盲盒抽卡机小程序系统的开发,致力于为商家和用户打造一个充满趣味与惊喜的数字化平台…...

Python实现快速排序的三种经典写法及算法解析

今天想熟悉一下python的基础写法,那就从最经典的快速排序来开始吧: 1、经典分治写法(原地排序) 时间复杂度:平均O(nlogn),最坏O(n) 空间复杂度:O(logn)递归栈空间 特点:通过左右指针…...