码迷,mamicode.com
首页 > 其他好文 > 详细

《RabbitMQ 消息中间件》如何保证消息可靠性

时间:2021-05-24 16:53:14      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:com   发送   事务   一起   机制   导致   带来   接收   info   

前言

开发过程中遇到问题,要保证MQ消息一定被消费。

经过

情况一:

技术图片

这种情况下:MQ已经发送出去,但是这个事务其实已经被回滚。

情况二:

技术图片

这种情况下,MQ发送如果出现问题,就导致MQ消息没有发送。

情况三:

技术图片

服务A发送消息后, 其实是不知道服务B是否处理消息。 

如何使用MQ的同步机制,服务A继续收到服务B处理消息的反馈又违背了我们使用MQ的初衷(异步处理)。

整改(消息可靠性)

发送端改造:

技术图片

这样可以保证消息和其他的SQL语句的事务保持一致,要不一起成功,要不一起失败。

技术图片

单独线程处理已经落库的消息,发送给服务B,并且一定要等到服务B给出消息处理的ACK才将自己的消息置成已经处理,不再发送。

这样就保证了服务B一定会消费消息,不消费也都能很容易的发现和重新发送消息。

接收端改造:

因为服务A是轮询发送未处理的消息,所以在服务B已经消息,但是通知服务A的时候失败,就会导致服务A重新发送消息,这样服务B再次接收到消息就不应该处理而是应该

抛弃。

技术图片

通过判断唯一识别码,来实现幂等,保证消息不被重复处理。

总结

MQ消息带来了便利,同时也对应的带来了风险。如果需要保证数据安全,可以考虑作者的这种方式。

《RabbitMQ 消息中间件》如何保证消息可靠性

标签:com   发送   事务   一起   机制   导致   带来   接收   info   

原文地址:https://www.cnblogs.com/jssj/p/14787614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!