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) { //每一本…

Spring3系列12-Spring AOP AspectJ

本文讲述使用AspectJ框架实现Spring AOP。 再重复一下Spring AOP中的三个概念&#xff0c; Advice&#xff1a;向程序内部注入的代码。Pointcut&#xff1a;注入Advice的位置&#xff0c;切入点&#xff0c;一般为某方法。Advisor&#xff1a;Advice和Pointcut的结合单元&#…

论文阅读: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…

Rust小技巧 - 让函数既可接受String或str,也可以返回String或str

文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明 假设我们有一个函数foo&#xff0c;它既要允许&str也要允许String作为输入参数。或是既要允许&str也要允许String作为输出。&str和String之间的…

JSP九大内置对象(转载)

JSP中一共预先定义了9个这样的对象&#xff0c;分别为&#xff1a;request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息&#xf…

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

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

Rust小技巧 - 把异步函数放进vector当中

文章目录1 场景说明2 解决方案2.1 无借用参数2.2 有借用参数参考资料1 场景说明 有些时候&#xff0c;我们希望将将异步函数放到vector当中&#xff0c;或者说是注册进vector当中&#xff0c;然后在某个地方遍历这个vector来实现对已经注册了的异步函数的调用。 Cargo.toml中…

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

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

tch-rs指南 - Tensor的基本操作

文章目录1 概述2 Tensor的基本操作2.1 Tensor的初始化&#xff08;1&#xff09;通过数组创建&#xff08;2&#xff09;通过默认方法创建&#xff08;3&#xff09;通过其他的tensor创建&#xff08;4&#xff09;通过opencv::core::Mat创建2.2 Tensor的属性2.3 Tensor的运算&…

命令行运行jmeter脚本

1、通过gui界面的jmeter创建一份脚本&#xff1b;2、打开cmd,切换到jmeter程序的Bin目录&#xff1b;3、执行jmeter.bat -n -t bookair_0613.jmx -l log_3.jtl&#xff1b;4、使用gui界面添加一个监听器&#xff0c;打开log_3.jtl文件&#xff0c;来分析测试结果。转载于:https…

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

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

Rust小技巧 - 通过FFI编程运行tensorrt模型

文章目录1 概述2 使用说明2.1 配置说明2.2 修改c头文件2.3 编写build.rs2.4 测试参考资料1 概述 shouxieai/tensorRT_Pro是一个文档完善&#xff0c;效果也很不错的tensorrt库&#xff0c;里面有对yolov5&#xff0c;yolox&#xff0c;unet&#xff0c;bert&#xff0c;retina…