rocketmq queue_RocketMQ 实战(三) - 消息的有序性

v2-6e00c16d228e369ed95be07eff72b410_1440w.jpg?source=172ae18b

■ RocketMQ有序消息的使用

1 为什么需要消息的有序性

比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢! M1 - 存钱 M2 - 取钱

v2-2861fdfb0eb85984ee8ccd4e931ef264_b.jpg

而mq默认发消息到不同q显然是行不通的,会乱序 需要发往同一个q,先进先出

2 有序消息的基本概念

有序消息又叫顺序消息(FIFO 消息) 是指消息的消费顺序和产生顺序相同,在有些业务逻辑下,必须保证顺序。

比如订单的生成、付款、发货,这个消息必须按顺序处理才行。 顺序消息分为全局顺序和分区(queue)顺序

2.1 全局顺序

概念

一个Topic内所有的消息都发布到同一个queue,按照先进先出的顺序进行发布和消费

v2-f7893a46c96c2fa0d629d78073c9435b_b.png

适用场景

性能要求不高,所有的消息严格按照FIFO原则进行消息发布和消费的场景

2.2 分区顺序

概念

v2-5f7d82250db49120b6911f3f6ee33a82_b.jpg

对于指定的一个Topic,所有消息根据sharding key进行区块(queue)分区

同一个queue内的消息按照严格的FIFO顺序进行发布和消费

Sharding key是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key是完全不同的概念

适用场景

性能要求高,根据消息中的sharding key去决定消息发送到哪-个queue

2.3 全局顺序与分区顺序对比

发发送方式对比

v2-59696bef5183c55b1efb48591a1d6400_b.jpg

3 如何保证消息顺序

在MQ的模型中,顺序需要由3个阶段去保障

  1. 消息被发送时保持顺序
  2. 消息被存储时保持和发送的顺序一致
  3. 消息被消费时保持和存储的顺序一致

v2-54a9a302a3bbc88af61c6eadeb95caf4_b.jpg

4 RocketMQ 的有序消息实现原理

v2-c11116dbf3a52e7534dd86ca7842e257_b.jpg

RocketMQ消费端有两种类型:

  • MQPullConsumer
  • MQPushConsumer

底层都是通过pull机制去实现,pushConsumer是一种API封装

MQPullConsumer 由用户控制线程,主动从服务端获取消息,每次获取到的是一个MessageQueue中的消息。

PullResult中的 List<MessageExt> msgFoundList自然和存储顺序一致,用户需要再拿到这批消息后自己保证消费的顺序。

MQPushConsumer由用户注册MessageListener来消费消息,在客户端中需要保证调用MessageListener时消息的顺序性

v2-74485b30838132eb8e34e8136de0b265_b.jpg

v2-93591bb835f3af7b59ee112fd957d671_b.jpg

看源码

v2-ed8878dbd7e609cad11cd4be7c3f944b_b.png

v2-37758611b22ec7b499b485e56904e319_b.jpg

v2-cfdf5886e289151b5fc38edbedcc412f_b.png
  • 拉取生产端消息

v2-70db45c4ad9678d6729ef7f7f076d7ca_b.jpg
  • 判断是并发的还是有序的,对应不同服务实现类

v2-1c22eeb8c55359bd25037f1f5f484dc3_b.png

5 有序消息的缺陷

发送顺序消息无法利用集群的Failover特性,因为不能更换MessageQueue进行重试

因为发送的路由策略导致的热点问题,可能某一些MessageQueue的数据 量特别大 ◆ 消费的并行读依赖于queue数量 ◆ 消费失败时无法跳过

6 使用

见官网Order-example

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

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

相关文章

三十、PHP框架Laravel学习笔记——模型的预加载

一&#xff0e;预加载 预加载&#xff0c;就是解决关联查询中产生的 N1 次查询带来的资源消耗我们要获取所有书籍的作者(或拥有者)&#xff0c;普通查询方案如下&#xff1a; //获取所有书籍列表 $books Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant&#xff0c;却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意&#xff1a;1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD&#xff0c;df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用&#xff0c;对npm的掌握是必不可少的&#xff0c;经常到npm官网查询文档让我感到不爽&#xff0c;还不如整理了一些常用的命令到自己博客上&#xff0c;于是根据自己的理解简单翻译过来&#xff0c;终于有点输出&#xff0c;想学习npm这块的朋友不可…

论文阅读 - CRNN

文章目录1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分3 模型效果参考资料1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的&#xff0c;直至今日&#xff0c;仍…

python easygui_Python里的easygui库

想要用python开发一些简单的图形界面&#xff0c;于是接触了easygui库&#xff0c;由于这是新手教程&#xff0c;我会把它写的尽量简单&#xff0c;希望大家都能看懂。1.msgboxmsgbox( )有一个标题&#xff0c;内容和一个ok键(是可以更改的)。举个例子&#xff1a;import easyg…

recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

作者简介 陈东明&#xff0c;饿了么北京技术中心架构组负责人&#xff0c;负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师&#xff0c;负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验&#xff0c;善于复杂业务需求下…

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展&#xff0c;现在都开始在软件上记事备忘了。那么&#xff0c;都有哪些好用的记事本软件可以选择使用呢&#xff1f;大家在选择记事本软件的时候&#xff0c;都有哪些标准呢&#xff1f;不知道大家的标准是什么&#xff0c;小编有一个不能妥协的标准&#…

bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

本节是建立在上节的基础上&#xff0c;上一节给大家讲了管理后台表格如何展示数据&#xff0c;但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作1&#xff0c;项目要引入freemarker和bootstrap&#xff0c;如果不知…

1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据

一、新增数据 插入多条数据&#xff1a; 二、更新数据 更新某条数据&#xff1a; 自增某字段的值&#xff1a; 自减某字段的值&#xff1a; 自增的同时改变其他字段的值&#xff1a; 三、删除数据 四、查询 查面构造器查面数据 有以下几种方法 get&#xff08;&…

【HTML5】Canvas画布

什么是 Canvas&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 画布是一个矩形区域&#xff0c;您可以控制其每一像素。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 * 添加 canvas 元素。规定元素的 id、宽度和高度&#xff1a; &l…

SynthText流程解读 - 不看代码不知道的那些事

文章目录1 概述2 流程解读2.1 生成文字mask2.2 plane2xyz的bug2.3 文字上色2.4 图像融合参考资料1 概述 SynthText是OCR领域生成数据集非常经典&#xff0c;且至今看来无人超越的方法。整体可以分为三个大的步骤&#xff0c;分别是生成文字的mask&#xff0c;这里用到了图像的…

python if name main 的作用_Python中if __name__ == '__main__':的作用和原理

if __name__ __main__:的作用 一个python文件通常有两种使用方法&#xff0c;第一是作为脚本直接执行&#xff0c;第二是 import 到其他的 python 脚本中被调用&#xff08;模块重用&#xff09;执行。因此 if __name__ main: 的作用就是控制这两种情况执行代码的过程&#x…

1+X web中级 Laravel学习笔记——Eloquent ORM查询、更新、删除、新增

Eloquent ORM简介 larave1所自带的Eloquent oRM是一个非常优美简洁的ActiveRecord实现&#xff0c;用来实现数据库的操作他的每个数据的表都有对应的模型&#xff08;model&#xff09;用于数据表的交互模型的建立 一、Eloquent ORM的查询 二、Eloquent ORM新增 通过模型新增…

使用复合设计模式扩展持久化的CURD,Select能力

大家可能会经常遇到接口需要经常增加新的方法和实现&#xff0c;可是我们原则上是不建议平凡的增加修改删除接口方法&#xff0c;熟不知这样使用接口是不是正确的接口用法&#xff0c;比如我见到很多的项目分层都是IDAL&#xff0c;DAL&#xff0c;IBLL&#xff0c;BLL&#xf…

1+X web中级 Laravel学习笔记——blade模版

一、blade模版简介 Blade是larave1提供的一个既简单又强大的模版引擎和其他的流行的php模版引擎不一样&#xff0c;blade并不限制你在视图&#xff08;view&#xff09;中使用原生php代码 二、 模版继承 section yield extents parent 三、基本语法以及include的使用 1…