当前位置: 首页 > news >正文

【MQ篇】初识RabbitMQ保证消息可靠性

在这里插入图片描述

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 MQ 请看 : 【MQ篇】初识MQ!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

哈哈,老伙计,又见面了!😁 之前我们在 CSDN 上聊了 RabbitMQ 的那些“奇葩”事儿,这次咱们来聊聊它怎么当个“靠谱的”快递小哥,保证你的消息一个不丢!📦💨

你想想看,你的消息可能是啥?可能是老板的紧急指令 (“明天早上务必交报告!” 😱),可能是老婆的购物清单 (“我要这个包包!👜✨”),也可能是系统的关键通知 (“用户 XX 支付成功!💰”)。这些东西要是丢了,那可是要命的啊!☠️

所以,RabbitMQ 为了保证这些“重要包裹”安全送达,可是使出了浑身解数,从好几个方面层层把关,简直是消息界的“安全卫士”!🛡️

它是怎么做的呢?主要从这几个方面下手:

  1. 发送方确认机制 (Publisher Confirms) - “你把包裹交给邮局了吗?邮局说收到没?” 🤔

    • 问题所在: 你(生产者 P)把消息发给了 RabbitMQ(邮局),但你咋知道 RabbitMQ 真收到了呢?万一网络抽风,或者 RabbitMQ 还没来得及处理就跪了?😵‍💫 你傻傻地以为发成功了,结果消息根本没到!
    • 怎么做: RabbitMQ 有个功能叫 Publisher Confirms。生产者发消息后,不是拍拍屁股就走人 👋。它会等着 RabbitMQ 给个“回执”——收到啦!👍 或者“没收到/处理失败”——啊哦!😭。
    • 好比: 你发了条微信消息给朋友,不是显示“已发送”就完事,还得等个“✓✓”或者“已读”标志,你心里才踏实。或者更像你把一封重要信件投到邮筒,你得等邮局给你发个短信说“您的邮件已揽收”你才放心,对吧?📨✅
    • 所以: 生产者开启这个功能后,只有收到 RabbitMQ 的确认,才认为消息成功发送。如果没收到确认或者收到失败通知,生产者就知道得重发这个消息了。贼靠谱!😎
  2. 消息持久化 (Persistence) - “停电了?重启了?我的包裹还在吗?” 👻

    • 问题所在: RabbitMQ 运行在内存里,速度快是快,但万一它所在的服务器突然断电或者需要重启维护呢?⚡️💥 内存里的东西瞬间就没了啊!那队列里的消息不就灰飞烟灭了?🌪️
    • 怎么做: RabbitMQ 允许你把重要的东西“写下来”,存到硬盘上!硬盘这东西,除非物理损坏,不然断电重启也不丢数据。💾
    • 具体写啥?
      • 交换机 (Exchange) 和队列 (Queue) 可以声明为 durable (持久化)。 这就像在邮局里,那些重要的分拣台和信箱是用水泥钢筋造的 🏗️,不是临时的纸板箱。即使邮局大楼摇晃一下,这些关键设施还在。
      • 消息本身可以标记为 persistent (持久化)。 这就像你寄的包裹,上面贴了个“重要!防水防震防火!”的标签 🔥💧🛡️。即使 RabbitMQ 这个“快递仓库”需要暂时关闭或搬家,这些打了标签的包裹都会被妥善保管在库房的地下室(硬盘)里,等恢复正常再拿出来继续处理。
    • 所以: 把队列和消息都设置为持久化后,即使 RabbitMQ 服务器重启,之前收到的、还没来得及处理的持久化消息依然会在队列里乖乖等着,不会消失。厉害吧!💪
  3. 消费者确认机制 (Consumer Acknowledgements) - “包裹送到了,客户签收并打开了吗?” 😉

    • 问题所在: RabbitMQ 把消息发给了消费者(C),消费者也收到了。但消费者收到后,可能需要花点时间处理(比如处理订单,发邮件等等)。万一消费者在处理过程中突然崩了呢?程序异常退出了?🐛👾 那消息虽然发给了它,但它压根没处理完啊!RabbitMQ 却可能以为“哦,消息发出去了,我的任务完成了!”然后就把这条消息删了。这就出问题了!❌
    • 怎么做: RabbitMQ 和消费者之间有个“签收”约定。当消费者收到消息后,它并不会立即告诉 RabbitMQ “搞定!”。它得等自己把消息里的事情办妥了,确信一切 OK 了,才会给 RabbitMQ 发一个“确认”信号 (ack)。
    • 好比: 快递员把包裹送到了你家门口,但他不会马上离开。他会等着你开门,拿包裹,甚至确认一下东西没问题了,你再给他一个“我收到啦,谢谢!”的手势或签字。✍️
    • 如果: 消费者在处理消息的过程中挂了,或者故意告诉 RabbitMQ “这个消息我处理不了!” (nack),RabbitMQ 就知道这个消息没有被成功处理,它会把这个消息重新排队,或者发给另一个“闲着”的消费者去处理。这样就保证消息不会因为某个消费者的临时故障而丢失或未处理。超级负责!💯
    • 还有个偷懒模式叫 auto-ack: 消费者一收到消息就自动确认。这个方便是方便,但风险很大!就像快递员把包裹往门口一扔就跑路 🏃💨,他根本不管你有没有拿到,包裹会不会被别人捡走。所以对于重要消息,坚决不能开 auto-ack!🙅‍♀️

总的来说,RabbitMQ 就是通过生产者要确认、消息要存盘、消费者要签收这三重保险,构建了一个“消息永不丢失”的可靠传输体系。👍👍👍

当然,这只是最核心的几个点。更高级的玩法还有比如集群、镜像队列(多个 RabbitMQ 互相备份,一个倒了另一个顶上,就像两个邮局互相帮助不让包裹积压 👯‍♀️)等等,那又是更深的学问了。

怎么样,是不是觉得 RabbitMQ 这个快递小哥挺拼的?为了你的消息安全,真是操碎了心啊!😂 希望这次的“不正经”讲解,能让你对 RabbitMQ 的可靠性有更深刻(也更欢乐)的理解!🥳

后续会结合代码来讲解演示消息的确认机制和持久化,关注作者不迷路!

相关文章:

  • Freertos----中断管理
  • Visual Studio Code 使用tab键往左和往右缩进内容
  • 水域陆地两相宜,便携漏电探测仪
  • 大数据驱动公共交通系统的智慧化革命
  • React19源码阅读之commitRoot
  • 架构-系统工程与信息系统基础
  • 提升内容创作效率:AI原创文章批量生成工具优势
  • CentOS 7.9升级OpenSSH到9.9p2
  • 专家系统的一般结构解析——基于《人工智能原理与方法》的深度拓展
  • DRF凭什么更高效?Django原生API与DRF框架开发对比解析
  • 要从给定的数据结构中提取所有的 itemList 并将其放入一个新的数组中
  • 计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
  • Electron Forge【实战】百度智能云千帆大模型 —— AI聊天
  • VMware与Docker:虚拟化技术的双轨演进与融合实践
  • Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?
  • 第十四届蓝桥杯省B.砍树
  • 12.桥接模式:思考与解读
  • 2025年计算机视觉与智能通信国际会议(ICCVIC 2025)
  • 对话模型和补全模型区别
  • LabVIEW实现Voronoi图绘制功能
  • 证券时报:落实“非禁即入” ,让创新活力充分涌流
  • 看展览|深濑昌久:一位超现实主义摄影者的三种意象
  • 商标乱象调查:“120W”充电器功率仅12W,120W为商标名
  • 汪东进卸任中海油董事长,深耕油气领域40余年、已临近退休
  • 舞剧《百合花》7月绽放,王安忆:这是送给母亲的一份礼物
  • 世界最大全电驱可拆装环保绞吸船投入官厅水库清淤试点工程