可靠消息最终一致性方案
5 分钟阅读
•
732 字
+
423 词
可靠消息最终一致性方案。它是保证事务最终一致性的一种方案,
允许数据在业务中出现短暂的不一致状态
。
可靠消息最终一致性方案是指,当事务的发起方(事务参与者,也就是消息发送者)
执行完本地事务后,同时发出一条消息
,事务参与方(事务参与者,也就是消息的消费者)一定能够接收消息并可以成功处理自己的事务
这里面强调两点。
上图是一个可靠消息服务最终一致性方案的流程图,从图中可以看出事务发起方将消息发送给消息中间件,事务消费方从消息中间件接收消息,事务发起方和消息中间件之间,事务消费方和消息中间件之间,都有网络通信,由于网络通信的不确定性,这块会导致数据的问题。下面针对导致的问题来分别进行解决。
(1)事务发起方本地事务和消息发送之间的原子性问题。
此问题是本地事务执行成功,消息必须发出去,否则丢弃消息,即本地事务执行成功和消息的发送成功,要么都成功,要么都失败。
来一段伪代码参考一下。
这种情况下,如果发送消息成功,数据库操作失败,则无法保证原子性。调换一下顺序。
这种情况下,
如果操作数据库出错,回滚
,不影响数据;
如果发送消息出错,也回滚,不影响数据
。这么一看似乎可以保证原子性,但是会有一种情况,
发送消息响应超时,导致数据库回滚,但是消息已经发送成功了。这时原子性还是无法保证的,这个时候就需要人工补偿了。
(2)事务消费方和消息消费的原子性问题。
此时要
保证事务消费方必须能接受到消息
,如果由于程序故障,导致事务消费方重启,那么需要消息中间件要有消息重发机制;由于网络延时的存在,当事务消费方消费消息成功,没有向消息中间件响应(或者响应包丢失了)时,而消息中间件由于重发机制,会再次投递消息,就导致了消息重复消费的问题。
此时在消费要有幂等性解决方案。
- 可靠消息 :发起方一定得把消息传递到消费者
- **最终一致性:**最终发起方的业务处理和消费方的业务处理得完成, 达成最终一致 。
可靠消息最终一致性问题分析
begin transaction;
发送消息;
操作数据库;
commit transaction;
begin transaction;
操作数据库;
发送消息;
commit transaction: