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