队列消息模型的特色:
一、消息生产者将消息发送到Queue中,而后消息消费者监听Queue并接收消息;
二、消息被确认消费之后,就会从Queue中删除,因此消息消费者不会消费到已经被消费的消息;
三、Queue支持存在多个消费者,可是对某一个消息而言,只会有一个消费者成功消费。并发
经常使用的MQ中间件产品ActiveMQ、RabbitMQ、RocketMQ等基本都是这样的流程,具体实现上有各自的差别。规范协议实现上有JMS、AMQP或自定义规范等。异步
①Producer生成消息并发送给MQ(同步、异步);
②MQ接收消息并将消息数据持久化到消息存储(持久化操做为可选配置);
③MQ向Producer返回消息的接收结果(返回值、异常);
④Consumer监听并消费MQ中的消息;
⑤Consumer获取到消息后执行业务处理;
⑥Consumer对已成功消费的消息向MQ进行ACK确认(确认后的消息将从MQ中删除)。分布式
一、常规MQ队列消息的处理流程没法实现消息发送一致性;
二、投递消息的流程其实就是消息的消费流程,可细化。spa
1. 主动方应用先把消息发给消息中间件,消息状态标记为“待确认”;
2. 消息中间件收到消息后,把消息持久化到消息存储中,但并不向被动方应用投递消息;
3. 消息中间件返回消息持久化结果(成功/失败),主动方应用根据返回结果进行判断如何进行业务操做处理:
a) 失败:放弃业务操做处理,结束(必要时向上层返回失败结果);
b) 成功:执行业务操做处理;
4. 业务操做完成后,把业务操做结果(成功/失败)发送给消息中间件;
5. 消息中间件收到业务操做结果后,根据业务结果进行处理;
a) 失败:删除消息存储中的消息,结束;
b) 成功:更新消息存储中的消息状态为“待发送(可发送)”;
6. 被动方应用监听并接收“待发送”状态的消息,执行业务处理;
7. 业务处理完成后,向消息中间件发送ACK,确认消息已经收到(消息中间件将从队列中删除该消息)。中间件
常规MQ队列消息的处理流程没法实现消息发送一致性,所以直接使用现成的MQ中间件产品没法实现可靠消息最终一致性的分布式事务解决方案。队列