开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第四阶段:消息类型-顺序消息】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/686/detail/11910
消息类型-顺序消息
顺序消息
顺序消息是消息队列提供的一种严格按照顺序来发布和消费的消息类型。
RocketMQ 本身是一个先进先出的消息队列,本身已经保证消息的顺序性,单独的再搞一个顺序消息是因为前面普通消息没法保证消息的顺序发布和消费。跟 RocketMQ 本身的内部结构有关系。
这张图上左边部分是消息生产者,右边可以认为是 RocketMQ 里面的 Block,Block 里面是有多个 Message Quenue 存在。
接下来生产者开始往 Block 里面进行消息投递,在消息投递的时候默认是不能够保证消息会投递到哪一个 Message Quenue,比如消息生产者有三个消息1、2、3,这三个消息要求是有顺序性的,消息投递的时候可能第一个消息来到第一个 Block,第二个消息来到第二个关系。第三个消息可能到第三个上面,然后作为消费者看到的 Block 里面的 Message Quenue 是等价的,在消费的时候有可能先去消费第二个,再去消费第三个,再去消费第一个,不能够保证顺序消费的问题。
只需要保证把有顺序的消息投递到同一个 Message Quenue 上就可以了,比如三个消息,第一个投递过来是第一块的,第二个也要来到这块,第三个还要来到这,能够保证它都在同一个 Message Quenue 上,消费者在消费的时候对于同一个 message 上的数据,绝对是可以保证顺序消费的,解决了顺序发布消费的问题。
写代码之前首先来到控制页面,看一下 topic 主题,点击状态,可以看到当前主题下面的队列
默认有四个队列的,四个队列里面前三个已经有消息存在,有两个的,有一个的,接下来再来模拟发送几条普通消息,看是否会落在同一个 Message Quenue 上。
为了简单直接发送单向消息
//单向消息
@
Test
public void testoneWay() {
for (int i = o; i < 10; i++) {
rocketMoTemplate.sendOneWay(destination:"test-topic-1", payload:"这是一条单向消息")
;
}
}
}
运行一下,已经跑完
点击状态,发现落在每一个上面,第一个多三个,第二个多三个,第三个多两个,第四个多两个,一共是有十个消息分布在四个队列上去,保证不了消费的可引性。
发送顺序消息:
//参数随便写,保证不重复
//单向顺序消息
@Test
publia void testoneWayOrderly() {
for (inti=o;i<10;i++){
//第三个参数的作用是用来决定这些消息发送到哪个队列的上的
rocketMQTemplate.sendOneWayorderly( destination:
"test-to pic-1",payload:"这是一条单向消息",
hashKey:"xx");
}
}
}
发送消息看结果:
都落在第一个队列上,保证了发送时候都在同一个队列上,也保证了发送时的顺应性,这是单向消息的顺序。
对于其他的比如说同步和异步消息都提供了相同的 Orderly 上,用法和单向消息是完全一致的。