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