MQ消息一致性

1.远程调用,结果最终可能为成功、失败、超时;而对于超时的情况,处理方最终的结果可能是成功,也可能是失败,调用方是无法知晓的。 笔者就曾经在项目中出现类似的情况,调用方先在本地写数据,然后发起RPC服务调用,但是处理方由于DB数据量比较大,导致处理超时,调用方在出现超时异常后,直接回滚本地事务,从而导致调用方这边没数据,而处理方那边数据却已经写入了。
关键在于调用方如何处理返回结果未知这种情况。
 

2.事务消息(消息最终一致性)——本地事务与消息发送的原子性问题。

实现了生成者本地事务与消息发送的原子性,保证了消息生成者本地事务处理成功与消息发送成功的最终一致性问题。
 
基于MQ的事务消息解决方案:https://www.jianshu.com/p/eb571e4065ec
 
基于本地消息的最终一致性解决方案:在执行业务操作的时候,记录一条待发送消息数据到DB,并且消息数据的记录与业务操作必须在同一个事务内完成。在记录完成后消息数据后,后面我们就可以通过一个定时任务到DB中去轮训状态为待发送的消息,然后将消息投递给MQ。这个过程中可能存在消息投递失败的可能,此时就依靠重试机制来保证,直到成功收到MQ的ACK确认之后,再将消息状态更新或者消息清除;而后面消息的消费失败的话,则依赖MQ本身的重试来完成,其最后做到两边系统数据的最终一致性。
 
独立消息服务最终一致性
本地消息服务最终一致性最大的差异就在于将消息的存储单独地做成了一个RPC的服务,这个过程其实就是模拟了事务消息的消息预发送过程,如果预发送消息失败,那么生产者业务就不会去执行,因此对于生产者的业务而言,它是强依赖于该消息服务的。不过好在独立消息服务支持水平扩容,因此只要部署多台,做成HA的集群模式,
 
https://www.cnblogs.com/lyc88/articles/11250479.html
posted @ 2021-02-03 16:33  dsfsadfdgd  阅读(519)  评论(0编辑  收藏  举报