RocketMQ 顺序消息和事务消息及其原理

1、Spring Cloud Alibaba RocketMq 架构图

 
先上一张图,大致了解 Spring Cloud Alibaba RocketMq 架构图:
在这里插入图片描述

2、RocketMQ 顺序消息

 
RocketMQ的顺序消息分为:局部有序和全局有序。

  • 局部有序:指发送同一个队列的消息有序,可以在发送消息时指定队列,在消费消息时也按顺序消费。
    • 示例场景:同一订单ID的消息要保证有序,不同订单ID的消息没有约束,相互不影响,且不同订单ID之间的消息是并行的。
  • 全局有序:设置 Topic只有一个队列可以实现全局有序,创建Topic时手动设置。此类场景极少,性能差,一般不推荐使用。

 

2.1、RockerMQ 实现顺序消费

 
顺序消息分为两部分:顺序发送(发消息)、顺序消费(收消息)。以下为实现局部有序示例:

2.1.1、顺序发消息

 
顺序发消息方式一

  • ① 修改生产端项目配置为同步发送

    #在项目spring.propeties配置文件中,设置同步发送。(默认市异步发送)
    # 所有通过 RocketMQTemplate 或其他相关组件发送的消息都会以同步的方式发送。
    spring.cloud.stream.rocketmq.output.producer.sync=true
    
  • ② MessageBuilder 设置Header信息头,表示该消息是一条顺序消息,将消息固定发送到指定的消息队列。

    @RestController
    public class sendMsgController {
         
        
        @Autowired
        private Source source;
        
        @GetMapping(value = "/sendOrderlyMsg")
        public String sendOrderlyMsg() {
         
            List<String> list = Arrays.asList("状态1","状态2","状态3");
            for (String msg : list) {
         
                // 这里指定消息发送到第0各消息队列
                MessageBuilder builder = MessageBuilder.withPayload(msg)
                       .setHeader(BinderHeaders.PARTITION_HEADER, 0);
                Message message = builder.build();
                source.output().send(message);
            }
            return "success";
        }
        
    }
    

顺序发消息方式二

@Slf4j
@SpringBootTest
public class SendSyncOrderlyMessageTest {
   

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Test
    public void sendOrderedStringMessage() {
   
        String message = "这是一条同步顺序消息:";
        for (int i = 0; i < 5; i++) {
   
            // hashkey是为了确保这些消息被路由到同一个消息队列,这样消费者就能够按照顺序处理它们
            rocketMQTemplate.syncSendOrderly("orderilMessageTopic", message + i, "syncOrderlyHashKey");
        }
    }
}

 

2.1.2、顺序收消息

  • 修改消费端项目配置为顺序消费。

    # 指定为顺序消费,这里默认配置为并发消费
    spring.cloud.stream.rocketmq.binding.input.consumer.orderly=true
    

2.2、顺序发送的技术原理

 
       RocketMQ 发送消息的三种方式:同步、异步、单向。RocketMQ 发送顺序消息的原理,就是同一类消息发送到相同的队列即可。为保证先发送的消息先存储到消息队列,必须使用同步发送的方式,否则可能出现先发的消息后到消息队列,此时消息就会乱序。

  • 同步:发送网络请求后会同步等待 Broker 服务器的返回结果,支持发送失败重试,适用于比较重要的消息通知场景。
  • 异步:异步发送网络请求,不会阻塞当前线程,不支持失败重试,适用于对响应时间要求更高的场景。
  • 单向:单向和异步发送的原理一致,但是不支持回调。适用于响应时间非常短,对可靠性要求不高的场景,如日志收集。

 
撸一撸源码,首先看看 org.apache.rocketmq.spring.core.RocketMQTemplate#syncSendOrderly()

public class RocketMQTemplate extends AbstractMessageSendingTemplate<String> implements InitializingBean, DisposableBean {
   <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值