码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【博学谷学习记录】超强总结,用心分享|架构师-RabbitMQ消息可靠性保障


    文章目录

    • 一、生产者保证
      • 1.1 失败通知
      • 1.2 发送方确认
      • 1.3 Broker丢失消息
    • 二、消费方消息可靠性
      • 2.1 消费者手动确认

    消息依靠三个对象:生产者、消费者、broker
    在这里插入图片描述

    一、生产者保证

    生产者发送消息到broker时,要保证消息的可靠性,主要的方案有:失败通知和发送方确认。

    1.1 失败通知

    当消息无法投递时会发送失败通知。在发送消息时设置mandatory标志,即可开启故障检测模式。

    在这里插入图片描述
    注意的点是,失败通知只会让 RabbitMQ 向你通知失败,而不会通知成功,如果消息正确路由到队列,则发布者不会受到任何通知,带来的问题是无法确保发布消息一定是成功的,因为通知失败的消息可能会丢失。

    1.2 发送方确认

    发送方确认是指生产者投递消息后,如果 Broker 接收到消息,则会给生产者一个应答,生产者进行接收应答,用来确认这条消息是否正常的发送到 Broker,这种方式也是消息可靠性投递的核心保障
    rabbitmq消息发送分为两个阶段:
    1、将消息发送到broker,即发送到exchage交换机
    2、消息通过交换机exchange被路由到队列queue
    一旦消息投递到队列,队列则会向生产者发送一个通知,如果设置了消息持久化到磁盘,则会等待消息持久化到磁盘之后再发送通知

    注意:发送发确认只有出现RabbitMQ内部错误无法投递才会出现发送发确认失败。

    1.3 Broker丢失消息

    假设有现在一种情况,生产者已经成功将消息发送到了交换机,并且交换机也成功的将消息路由到了队列中,但是在消费者还未进行消费时,mq挂掉了,那么重启mq之后消息还会存在吗?如果消息不存在,那就造成了消息的丢失,也就不能保证消息的可靠性传输了。

    	也就是现在的问题变成了如何在mq挂掉重启之后还能保证消息是存在的?
    
    • 1

    开启RabbitMQ的持久化,也即消息写入后会持久化到磁盘,此时即使mq挂掉了,重启之后也会自动读取之前存储的额数据。

    二、消费方消息可靠性

    2.1 消费者手动确认

    消费者接收到消息,但是还未处理或者还未处理完,此时消费者进程挂掉了,比如重启或者异常断电等,此时mq认为消费者已经完成消息消费,就会从队列中删除消息,从而导致消息丢失。

    那该如何避免这种情况呢?这就要用到RabbitMQ提供的ack机制,RabbitMQ默认是自动ack的,此时需要将其修改为手动ack,也即自己的程序确定消息已经处理完成后,手动提交ack,此时如果再遇到消息未处理进程就挂掉的情况,由于没有提交ack,RabbitMQ就不会删除这条消息,而是会把这条消息发送给其他消费者处理,但是消息是不会丢的。

  • 相关阅读:
    Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)
    嵌入式分享合集106
    【Spring】bean的基础配置
    java面向对象----封装 && 构造器
    Bean 作用域和生命周期
    2024前端面试准备之HTML篇
    ENSP交换机接口trunk和access互改
    采用附加动量法和自适应学习率设计来改进bp神经网络的迭代速度,如果不迭代学习率会提高精度;迭代学习率(自适应)会加快收敛,但精度降低(Matlab代码实现)
    一篇文章告诉你什么是Java内存模型
    腾讯云和阿里云2核2G服务器租用价格表对比
  • 原文地址:https://blog.csdn.net/qq_22043649/article/details/127999474
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号