跳到主要内容

二十四、RocketMQ事务消息实战


  我们以一个订单流转流程来举例,例如订单子系统创建订单,需要将订单数据下发到其他子系统(与第三方系统对接)这个场景,我们通常会将两个系统进行解耦,不直接使用服务调用的方式进行交互。其业务实现步骤通常为:
  1、A系统创建订单并入库。
  2、发送消息到MQ。
  3、MQ消费者消费消息,发送远程RPC服务调用,完成订单数据的同步。

  1、方案一
 
  方案弊端:
  1、如果消息发送成功,在提交事务的时候JVM突然挂掉,事务没有成功提交,导致两个系统之间数据不一致。
  2、由于消息是在事务提交之前提交,发送的消息内容是订单实体的内容,会造成在消费端进行消费时如果需要去验证订单是否存在时可能出现订单不存在。
  3、消息发送可以考虑异步发送。
  方案二:
  由于存在上述问题,在MQ不支持事务消息的前提条件下,可以采用下面的方式进行优化。
 
  然后在控制器层,使用异步发送,将消息发送,并在消息发送成功后,更新待发送状态为已发送。
  然后通过定时任务,扫描待发送,结合创建时间的记录(小于当前时间5分钟的消息待发送记录),进行消息发送。
  方案弊端:
  1、消息有可能重复发送,但在消费端可以通过唯一业务编号来进行去重设计。
  2、实现过于复杂,为了避免 极端情况下的消息丢失,需要使用定时任务。
  方案三:基于RocketMQ4.3版本事务消息
 
  额外需要实现事务会查监听器:TransactionListener,其实例代码: