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

前言

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

经过

情况一:

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

情况二:

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

情况三:

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

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

整改(消息可靠性)

发送端改造:

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

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

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

接收端改造:

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

抛弃。

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

总结

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

posted @ 2021-05-19 22:09  加速丨世界  阅读(145)  评论(0编辑  收藏  举报