RocketMQ有序消息
RocketMQ发送消息之有序消息
如果某一笔业务分为多条普通消息同时发送,消费者无法保证按按生产者预期的顺序进行消费,进而导致代码逻辑错误。

分区有序消息
● 分区有序消息:与Kafka中的分区类似,把一个Topic消息分为多个分区“保存”和消费,在一个分区内的消息就是传统的队列,遵循FIFO(先进先出)原则。
● 全局有序消息:如果把一个Topic的分区数设置为1,那么该Topic中的消息就是单分区,所有消息都遵循FIFO(先进先出)的原则。

部署拓扑

代码案例
1 | <dependency> |
1 | //发送分区顺序消息 |
输出结果
1 | 15:04:49.407 [main] INFO com.lixiang.rocketmq.mtype.MessageType2 - 当前队列数量:4,明细:[MessageQueue [topic=tax-data, brokerName=broker-a, queueId=0], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=1], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=2], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=3]] |
全局有序消息(单broker)
在实现MessageQueueSelector接口时,固定选择某个队列就代表全局有序。注意:这里的全局有序代表broker中全局有序。如果消息被分发到不同的broker中,不保证有序,当然这种使用方法是错误的。
代码案例
1 | SendResult result = producer.send(message, new MessageQueueSelector() { |
输出结果
1 | 15:08:18.295 [main] INFO com.lixiang.rocketmq.mtype.MessageType2 - 当前队列数量:4,明细:[MessageQueue [topic=tax-data, brokerName=broker-a, queueId=0], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=1], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=2], MessageQueue [topic=tax-data, brokerName=broker-a, queueId=3]] |