分布式事务中常规MQ队列消息的处理流程和特点

           消息中间件在分布式系统中的主要作用:异步通讯、解耦、并发缓存

在分布式部署环境下,需要通过网络进行通讯,就引入了数据传输的不确定性也就是CAP理论中的P(分区容错性的问题)

                           流程图:

                                        

     消息发送的一致性如何保障
1.如果业务操作成功,执行消息发送前应用故障,消息发不出去,导致消息丢失(订单系统与会计系统数据不一致)
2.如果业务操作成功,应用正常,但消息系统故障或网络故障,也会导致消息发不出去(订单系统和会计系统的数据不一致)
     消息发送一致性
1.主动方应用先把消息发送给消息中间件,消息状态标记为"待确认"
2.消息中间件收到消息后,把消息持久化到消息存储中,但并不向被动方应用投递消息
3.消息中间件返回消息持久化结果(Ok/error),主动方应用根据返回结果进行判断如何进行业务操作处理
4.业务操作完成后,把业务操作结果发送给消息中间件
5.消息中间件收到业务操作结果后,根据业务结果进行处理
6.前面的正向流程都成功后,向被动方应用投递消息。
     消息发送一致性的异常情况分析
                        1.从主动方应用的角度来分析:


异常情况 可能的状态 一致性
预发送消息失败  消息为进储存、业务操作未执行(可能的原因,主动方应用、网络、消息中间件、消息存储) 一致
预发送消息后,主动方应用没有收到返回消息存储的结果

 消息未存储,业务操作未完成

消息已进存储,业务操作未完成  

一致

不一致

收到消息存储成功的返回结果,但未执行业务操作就失败 消息已进存储,业务操作未执行  不一致
     


    二、1.队列消息模型的特点:

1.消息生产者将消息发送到Queue中,然后消息消费者监听Queue并接收消息
2.消息被确认消费以后,就会从Queue中删除,所以消息消费者不会消费到已经被消费的消息
3.Queue支持存在多个消费者,但是对某一个消息而言,只会有一个消费者成功消费

                   2.MQ队列消息的生产与消费常规流程

1.Product生成消息并发送给MQ
2.MQ接受到消息并将消息数据持久化到消息储存(持久化操作作为可选配置)
3.MQ向Product返回消息的执行结果(返回值、异常)
4.Consumer监听并消费MQ中的消息
5.Consumer获取到消息后执行业务处理
6.Consumer对已成功消费的消息向MQ进行ACK确认(确认后的消息将从MQ中删除)

                        常规的MQ队列消息的处理流程无法实现消息发送的一致性

                    3.最终的方案

1.主动方应用先把消息发送给消息中间件,消息状态标记为"待确认"
2.消息中间件收到消息后,把消息持久化到消息存储中,但并不向被动方应用投递消息
3.消息中间件返回消息持久化结果(Ok/error),主动方应用根据返回结果进行判断如何进行业务操作处理
4.业务操作完成后,把业务操作结果发送给消息中间件
5.消息中间件收到业务操作结果后,根据业务结果进行处理
6.被动方应用监听并接收“待发送”状态的消息,执行业务处理
7.业务处理完成后,向消息中间件发送ACK,确认消息已经收到(消息中间件将从队列中删除该消息)

猜你喜欢

转载自blog.csdn.net/qq_40280705/article/details/80549905
今日推荐