公众号merlinsea
- 核心
- 利用队列的延迟特性,只有二次确认的消息才能被消费者监听使用。适用于上下游事务不保证实时一致性,但可以保证最终一致性的业务场景。
- 原理
- 通过mq实现分布式事务的最终一致性,其中消息生产者是分布式事务中的一个节点,消息消费者也是分布式事务的一个节点。当消息生产者往消息队列中投递消息,此时消息还不能被消费者立即消费(即处于为为投递状态),当消息生产者完成了本地事务的时候,就向消息队列发送确认消息,此时消息队列中的消息才能被投递,然后消费者监听到消息,就去执行相关分布式事务的操作。因此可以看出通过消息队列解决分布式事务问题不能保证实时的事务一致性,但最终可以达到事务的一致性。
- 半事务消息
- 暂不能投递的消息,发送方已经成功地将消息发送到了消息队列服务端,但是消息队列还未收到生产者对该消息的二次确认,因此这种消息是暂时不能被消费者监听。此时该消息被标记成“暂不能投递”状态,处于该种状态下的消息即半事务消息。
- 消息回查
- 由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,消息队列服务端通过定时任务扫描发现某条消息长期处于 “半事务消息”时,需要主动向消息生产者询问该消息的最终状态(Commit或是Rollback),该询问过程即消息回查
- 利用消息队列解决分布式事务问题的优缺点
- 优点
- 事务消息不仅可以实现应用之间的解耦,又能保证数据的最终一致性
- 同时将传统的大事务可以被拆分为小事务,能提升效率
- 不会因为某一个关联应用的不可用导致整体回滚,从而最大限度保证核心系统的可用性
- 缺点
- 不能实时保证数据一致性
- 极端情况下需要人工补偿,比如假如生产者成功处理本地业务,消费者始终消费不成功