其实顺序消息是业务中常用的功能之一,只要是使用MQ的,就不太可能绕的过去这个问题。就算是业务上不需要保证顺序消息,但是作为开发,作为码农,怎么着都要跟你的PM确认一下需求的啦,那肯定就会聊到MQ的顺序消息的啦!
举一个简单的例子,咱们就不说老生常谈的购物交易系统,订单系统之类的,就比如数据库的BinLog消息,数据库执行新增,修改,删除语句,那BinLog记录的也必须是新增,修改,删除语句,这个很好理解吧。
那话不多说,咱们直接开整~
风和日丽,天朗气清,又是适合面试的一天,作为一个十面九offer的面试者,又来拜访面试官了。
小伙子,上次咱们聊到RocketMQ的性能优化,你回答的不错,那你知道RocketMQ是怎么保证顺序消息的吗?
哎哟,这不是侮辱人呢吗,我都自己聊到RocketMQ了,我害怕你问?那我害怕你不问呢。
推了推眼镜,故作思考:
是这样的面试官大佬,顺序消息呢,分为顺序发送和顺序接收,而在RocketMQ中呢,本身是支持顺序消息的, 所以在代码上实现起来也是很简单的。
顺序发送消息:
-
首先,我们可以把我们spring.properties中的配置更改为以下配置,保证同步发送:
spring.cloud.stream.rocketmq.bindings.output.pruducer.sync=true
-
其次,我们在业务代码中发送消息时,指定消息发送的Header,指定发送到第0个消息队列:
ini复制代码
@RestController public class OrderlyController { @Autowired private Source source; @GetMapping(value = "/orderly") public String orderlySend() { List<String> messageList = Arrays.asList("insert", "update", "delete"); for (String message : messageList) { MessageBuilder builder = MessageBuilder.withPayload(message).setHeader(BindingHeaders.PARTITION_HEADER, 0); Message msg = builder.build(); source.output().send(message); } return "success"; } }