首页 > 其他分享 >RocketMQ顺序消息

RocketMQ顺序消息

时间:2024-04-25 17:12:50浏览次数:23  
标签:顺序 Queue 消费 消息 key Consumer RocketMQ

什么是顺序消息

顺序消息指的是,严格按照消息的发送顺序进行消费的消息(FIFO)。

默认情况下生产者会把消息以Round Robin轮询方式发送到不同的Queue分区队列;而消费消息时会从
多个Queue上拉取消息,这种情况下的发送和消费是不能保证顺序的。

但是如果控制发送的顺序消息只依次发送到同一个queue中,消费的时候只从这个queue上依次拉取,则就保证了顺序。当发送和消费参与的queue只有一个,则是全局有序;如果有多个Queue参与,其仅可保证在该Queue分区队列上的消息顺序,则为分区有序,即相对每个queue,消息都是有序的。
image

在创建Topic时指定Queue的数量。有三种指定方式:
1)在代码中创建Producer时,可以指定其自动创建的Topic的Queue数量
2)在RocketMQ可视化控制台中手动创建Topic时指定Queue数量
3)使用mqadmin命令手动创建Topic时指定Queue数量

image

如何实现Queue的选择?在定义Producer时我们可以指定消息队列选择器,而这个选择器是我们
自己实现了MessageQueueSelector接口定义的。
在定义选择器的选择算法时,一般需要使用选择key。这个选择key可以是消息key也可以是其它
数据。但无论谁做选择key,都不能重复,都是唯一的。
一般性的选择算法是,让选择key(或其hash值)与该Topic所包含的Queue的数量取模,其结果
即为选择出的Queue的QueueId。
取模算法存在一个问题:不同选择key与Queue数量取模结果可能会是相同的,即不同选择key的
消息可能会出现在相同的Queue,即同一个Consuemr可能会消费到不同选择key的消息。这个问
题如何解决?一般性的作法是,从消息中获取到选择key,对其进行判断。若是当前Consumer需
要消费的消息,则直接消费,否则,什么也不做。这种做法要求选择key要能够随着消息一起被
Consumer获取到。此时使用消息key作为选择key是比较好的做法。
以上做法会不会出现如下新的问题呢?不属于那个Consumer的消息被拉取走了,那么应该消费
该消息的Consumer是否还能再消费该消息呢?同一个Queue中的消息不可能被同一个Group中的
不同Consumer同时消费。所以,消费现一个Queue的不同选择key的消息的Consumer一定属于不
同的Group。而不同的Group中的Consumer间的消费是相互隔离的,互不影响的。

为什么需要顺序消息

下面用订单进行分区有序的示例。一个订单的顺序流程是:下订单、发短信通知、物流、签收。
image
这种情况下,我们希望Consumer消费消息的顺序和我们发送是一致的,然而上述MQ的投递和消费方
式,我们无法保证顺序是正确的。对于顺序异常的消息,Consumer即使设置有一定的状态容错,也不
能完全处理好这么多种随机出现组合情况。

基于上述的情况,可以设计如下方案:对于相同订单号的消息,通过一定的策略,将其放置在一个
Queue中,然后消费者再采用一定的策略(例如,一个线程独立处理一个queue,保证处理消息的顺序
性),能够保证消费的顺序性。
image

标签:顺序,Queue,消费,消息,key,Consumer,RocketMQ
From: https://www.cnblogs.com/zuitaiping/p/18158143

相关文章

  • 数据结构:顺序栈的创建·插入·删除
    数据结构:顺序栈的创建·插入·删除目录数据结构:顺序栈的创建·插入·删除栈的原理设计思路代码栈的原理​ 栈(stack),存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈(PUSH)、出栈(POP)的说法。闭合的一端被称为栈......
  • RocketMQ定时/延时消息
    什么是延时消息当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息。采用RocketMQ的延时消息可以实现定时任务的功能,而无需使用定时器。典型的应用场景是,电商交易中超时未支付关闭订单的场景,12306平台订票超时未支付取消订票的场景。在电商平台中,订单创建......
  • 用顺序栈判断输入的字符串是否有效 (笔试题)
    思想:1、先对Manager的Top(栈中有效数据的下标)备份,用循环对字符串进行遍历a.当前字符不为'('和‘)’则进行下一次循环b.当前字符为'('则将'('入栈,并将Manager中的Top(下标)加1c.当前字符为')'则判断当前Top是否与备份的数值相等,如不相等,则')'前面没有'('与之配对,既字符串无效,直......
  • 利用顺序栈进行进制转换程序
    数据结构顺序栈笔试题:设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。/***************************************************************************************file......
  • 答案篇——PTA——顺序表
    读入n值及n个整数,建立顺序表并遍历输出。输入格式:读入n及n个整数输出格式:输出n个整数,以空格分隔(最后一个数的后面没有空格)。输入样例:在这里给出一组输入。例如:4-3102078输出样例:在这里给出相应的输出。例如:-3102078点击查看代码#include<bits/stdc++.h>#......
  • 顺序栈的接口程序
    顺序栈的接口程序头文件#include<stdio.h>#include<stdbool.h>#include<stdlib.h>创建顺序栈//指的是顺序栈中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体ty......
  • 顺序栈的接口设计
    /***********************************************************************************************************该程序实现顺序栈元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以顺序栈中元素的*数据类型为DataType_t,用户可以根据实际情况修改顺序......
  • RocketMQ普通消息
    消息发送分类同步发送消息同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。在mq集群中,也是要等到所有的从机都复制了消息以后才会返回,所以针对重要的消息可以选择这种方式。异步发送消息异步发......
  • rocketMQ安装教程
     文章地址:https://blog.csdn.net/qq_43600166/article/details/136187969文章目录前言一、rocketMQ安装教程二、rocketmq-console可视化界面 前言本章节将介绍如何在docker环境下安装rocketmq以及rocketmq-console可视化界面一、rocketMQ安装教程在安装之前请保......
  • 顺序栈————遍历、出栈、入栈
    以数组作为基础实现栈空间(顺序栈)数组在内存中占用一块连续的空间,也就是数组元素的内存地址是连续的。为了实现栈,一般是把数组头作为栈底,数组头部到数组尾部作为栈的增长方向,也就是用户只在数组尾部对数据进行插入和删除。为了方便管理顺序栈所以需要构造管理顺序栈信息的结构体......