《RabbitMQ 消息中间件》如何保证消息可靠性
前言
开发过程中遇到问题,要保证MQ消息一定被消费。
经过
情况一:
这种情况下:MQ已经发送出去,但是这个事务其实已经被回滚。
情况二:
这种情况下,MQ发送如果出现问题,就导致MQ消息没有发送。
情况三:
服务A发送消息后, 其实是不知道服务B是否处理消息。
如何使用MQ的同步机制,服务A继续收到服务B处理消息的反馈又违背了我们使用MQ的初衷(异步处理)。
整改(消息可靠性)
发送端改造:
这样可以保证消息和其他的SQL语句的事务保持一致,要不一起成功,要不一起失败。
单独线程处理已经落库的消息,发送给服务B,并且一定要等到服务B给出消息处理的ACK才将自己的消息置成已经处理,不再发送。
这样就保证了服务B一定会消费消息,不消费也都能很容易的发现和重新发送消息。
接收端改造:
因为服务A是轮询发送未处理的消息,所以在服务B已经消息,但是通知服务A的时候失败,就会导致服务A重新发送消息,这样服务B再次接收到消息就不应该处理而是应该
抛弃。
通过判断唯一识别码,来实现幂等,保证消息不被重复处理。
总结
MQ消息带来了便利,同时也对应的带来了风险。如果需要保证数据安全,可以考虑作者的这种方式。
This moment will nap, you will have a dream; But this moment study,you will interpret a dream.