【微服务实战】分布式事务太重?基于 RocketMQ 事务消息的最终一致性解法
【摘要】 针对微服务拆分后跨库操作(如“下订单+扣库存”)带来的数据不一致痛点,本文摒弃了严重消耗并发性能的 2PC/Seata AT 强一致性模型,提供一套基于 RocketMQ 事务消息的工程化解法。通过“半消息投递”与“本地事务”的强绑定,以极致的吞吐量实现分布式系统的最终一致性。
在云原生微服务中,只要涉及跨服务的数据写入,必然面临分布式事务问题。如果直接使用传统的 2PC(两阶段提交)或 Seata AT 模式,全局锁会长时间霸占 RDS 的行级锁资源,导致核心业务接口在突发高并发时直接雪崩。
对于电商下单、积分派发等场景,标准的工程解法是:放弃强一致性,利用 RocketMQ 的事务消息(Transactional Message)实现可靠的异步最终一致性。
1. 核心机制:半消息(Half Message)拦截
业务发起方(如订单服务)在执行本地数据库 INSERT 前,先向 RocketMQ 发送一条“半消息”。这条消息对下游消费者是不可见的。只有当本地数据库事务明确成功后,才会提交确认(Commit),让下游看到并消费;若本地事务失败,则回滚(Rollback)该消息。
2. 核心代码改造:本地事务与消息提交解耦
在业务应用中,实现 RocketMQ 提供的 TransactionListener 接口。把容易报错的本地 DB 写操作放在 executeLocalTransaction 中执行:
Java
// Spring Boot 结合 RocketMQ 事务消息监听器示例
@RocketMQTransactionListener
public class OrderTransactionListener implements RocketMQLocalTransactionListener {
@Autowired
private OrderService orderService;
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
// 💡 核心:在此处执行本地数据库事务(如创建订单)
// 如果此处抛出异常或返回 ROLLBACK,RocketMQ 会直接丢弃那条半消息,下游不会误扣库存
orderService.createOrderInDB((OrderDTO) arg);
return RocketMQLocalTransactionState.COMMIT;
} catch (Exception e) {
log.error("本地订单入库失败,回滚事务消息", e);
return RocketMQLocalTransactionState.ROLLBACK;
}
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
// 💡 兜底机制:如果由于网络中断导致 RocketMQ 没收到 Commit/Rollback
// Broker 会定时回调此接口查询该订单是否真实入库,以此决定消息的去留
String orderId = msg.getHeaders().get("orderId").toString();
boolean exists = orderService.checkOrderExists(orderId);
return exists ? RocketMQLocalTransactionState.COMMIT : RocketMQLocalTransactionState.ROLLBACK;
}
}
3. 发送端触发逻辑
业务入口不再直接调 DB,而是通过 RocketMQTemplate 触发事务流转:
Java
// 业务入口仅需一行代码发起事务消息
rocketMQTemplate.sendMessageInTransaction("order-topic", message, orderDTO);
总结: 基于 RocketMQ 的事务消息,巧妙地将“跨网络的两段式提交”转化为了“本地事务与消息队列的内部确认”。这种架构去除了数据库层的分布式全局锁,极大释放了云数据库的并发写性能,是构建高吞吐、高可用分布式系统的标准解法。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)