携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
在解决高并发的场景下的分布式事务问题时,有时候我们可以通过放弃强一致性,而选择最终一致性,来提高系统的可用性。本文主要是讲基于 MQ 来解决分布式系统事务一致性的问题。
场景
订单系统 A 确认下单后,需要调用优惠系统 B,然后扣减到优惠,为了保证系统 A 和系统 B 事务的一致性。经过下单成功,扣减了优惠两个流程后数据保持有效,引入消息队列 MQ 的方案。
方案
订单系统 A 调用优惠券系统时,将扣减优惠券的事件放在 MQ 中,然后有优惠系统 B 执行优惠扣减。只需保证在系统A 和系统B的高可用情况下,就能解决分布式事务的问题。
基于 MQ 的可靠消息投递的方案不仅可以解决由于业务流程的同步执行而造成的阻塞问题,还可以实现业务解耦合流量削峰。
问题
1、如何保证消息可靠投递?
因为MQ 可以将消息持久化到消息队列中,在MQ出现宕机时只要重启后消息也不会丢失,还能继续被消费,所以只需要保证生产者和消费者服务都是高可用的前提下,消息都是可靠投递
2、若消费者系统执行过程中出现异常使得流程中断,就可能导致某消息丢失,该如何保证消息确实被消费
MQ 中持久化消息基本都是自动的,消费者接受到消息后会自动删除该消息,所以可以加入应答机制。
应答机制:消费者服务在处理完消息后,再告诉 MQ 删除掉消息。而不是消费者拿到消息后消息自动删除。这样就可以避免消息未被解决就被删除的问题。
3、高并发场景下,生产者和消费者都会出现问题。如消费者宕机,但生产者无法感知,还会一直发送消息,进入MQ 中无法被消费,导致堆积甚至会变成死信而被抛弃。
通过双向消息确认机制解决。系统 A 将要发送的数据持久化到本地数据库,然后设置状态为待发送,等系统 B 消费成功后也向MQ发送通知,系统 A 接收到消息后,再将消息的状态设置为已完成