zoukankan      html  css  js  c++  java
  • 《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.
  • 相关阅读:
    Exception和Error有什么区别?
    网络流量劫持的含义
    安全术语:
    加载相关
    10、接到任务后的整个测试前准备流程总结
    fiddler工具栏数据解释
    HTTP的请求头标签 If-Modified-Since
    VueStudyDemo
    Vue从入门到放弃
    TypeScript初体验
  • 原文地址:https://www.cnblogs.com/jssj/p/14787614.html
Copyright © 2011-2022 走看看