【从零开始学习RabbitMQ | 第一篇】如何确保生产者的可靠性

news2024/9/25 13:18:47

目录

前言:

生产者重连机制: 

生产者确认机制:

Publisher Confirm(生产者者确认)

Publish Return(发布返回)

总结:


前言:

        在现代的分布式系统中,消息队列扮演着至关重要的角色,它不仅为应用程序提供了异步处理的能力,还帮助实现了服务之间的解耦。RabbitMQ作为业界广泛使用的消息队列之一,以其高可靠性、易用性和灵活性而受到开发者的青睐。然而,即便拥有如此强大的工具,确保生产者在发送消息时的可靠性仍然是一个挑战。

要确保生产者的可靠性,主要有两种方式:

  • 生产者重连
  • 生产者确认 

生产者重连机制: 

生产者重连机制主要是为了保证生产者能够成功连接上MQ 

 当生产者尝试向MQ发送消息的时候,结果由于网络出现波动,导致连接MQ失败,在这种情况下,我们可以通过配置开启生产者重连机制

spring:
  rabbitmq:
    connection-timeout: 1s  #设置超时时间
    template:
      retry:
        enabled: true #开启超时重试机制
        initial-interval: 1000ms #失败后的初始等待时间
        multiplier: 1 #失败后下次等待时长倍数,下次等待时长= Initial - interval * multiplier
        max-attempts: 3 #最大重试次数

解释一下这段配置: 

  • 客户端将尝试在1秒内连接到RabbitMQ服务器。
  • 如果消息发送失败,将启用重试机制。
  • 初次重试将在失败后1秒进行。
  • 后续每次重试的等待时间都将是1秒(因为multiplier为1)。
  • 总共将尝试最多3次重发消息。

 但需要注意的是:这种重试是阻塞式重试,也就是说:他会把当前线程阻塞。所以如果对业务的性能有要求,建议禁用重试机制

生产者确认机制:

生产者确认机制主要是为了确保生产者能够成功向MQ发送消息

RabbitMQ一共有两种确认机制,分别是Publisher Confirm Publish Return 

Publisher Confirm(生产者确认)

发布者确认机制允许生产者请求一个确认从RabbitMQ服务器返回,以确保消息已经被服务器接收。当生产者启用此机制时,每发送一条消息,它都会等待一个来自服务器的确认。如果消息被成功接收,服务器会发送一个确认响应;如果消息发送失败,服务器会发送一个否定响应。

在Java的RabbitMQ客户端中,可以通过以下方式启用生产者确认:

channel.confirmSelect();

然后,生产者可以设置一个回调,用于处理确认或否定响应:

channel.addConfirmListener(new ConfirmListener() {
    @Override
    public void handleAck(long deliveryTag, boolean multiple) {
        // 消息发送成功
    }

    @Override
    public void handleNack(long deliveryTag, boolean multiple) {
        // 消息发送失败
    }
});

Publish Return(发布返回)

发布返回机制是指当生产者发送消息到RabbitMQ时,如果消息无法被路由到任何队列(例如,因为没有匹配的路由键或所有相关的队列都被绑定到了一个空交换器),RabbitMQ会将这个消息返回给生产者。

发布返回不是用于确认消息是否已经被服务器接收,而是用于通知生产者消息因为某些原因没有被队列接收。生产者可以设置一个ReturnListener来接收这些返回的消息:

channel.addReturnListener(new ReturnListener() {
    @Override
    public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, BasicProperties properties, byte[] body) {
        // 处理返回的消息
    }
});

我们可以用一句话来总结:Publisher Confirm 用来确认消息是否发送到MQ,而Publish Return 用来通知生产者哪些消息由于路由失败没有被接收

总结:

        在构建分布式系统时,消息队列扮演着至关重要的角色,尤其是在确保不同服务间可靠通信方面。RabbitMQ作为业界广泛采用的消息队列中间件,提供了一系列的机制来确保生产者的可靠性,从而帮助开发者构建更加健壮和可扩展的系统。

RabbitMQ通过其生产者确认机制(Publisher Confirms)确保消息能够成功发送到服务器。通过设置mandatory标志,生产者可以要求RabbitMQ确认每条消息是否已经被交换机正确接收。如果消息无法路由到任何队列,ReturnCallback将被触发,允许生产者对这种情况作出响应,比如进行重试或记录日志。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5个将文本转语音的工具,高考复习的绝佳助手

高考倒计时10天! 在这最后的冲刺阶段,同学们都在拼命刷题,但面对已经整理好的知识点,时间紧迫,如何高效复习呢? 别急,今天我要和大家分享一个绝佳的复习方法——文字转语音。这个方法可以让你…

鸿蒙4.2小版本推出,鸿蒙5.0已经不远了

上个月,市场上迎来了华为鸿蒙系统4字开头的小升级,版本来到了4.2版本。 我们先来看看4.2版本都给用户带来哪些特色: 界面切换更流畅:无论是响应速度还是操作手感,用户都将感受到更加迅速和顺滑的体验 搜星速度的显著…

人类和小鼠转录组上游分析

基础软件 conda install cutadapt, trimmomatic, samtools, hisat2, subread, deeptools -y人类转录组上游分析 # 样本名称 sample_namesample# 线程 threads4# 双端测序原始fastq1和fastq2路径 fastq1_path/path/${sample_name}_1.fq.gz fastq2_path/path/${sample_name}_2.…

【LeetCode】【9】回文数(1047字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个整数x,如果x是一个回文整数,返回true;否…

CATIA二次开发VBA入门(2)——认识CATIA内置的VBA开发界面

目录 引出VBA界面介绍工具条介绍view下拉菜单insert下拉format下拉debug下拉tool下拉help下拉【重要】补充窗口窗体的模态【重要】 总结认识CATIA二次开发刘瑞欣 vb程序设计教程Excel中的vba开发catia中的vba开发 宏的录制、回放和编辑宏代码精简画圆柱阵列宏Macro文件的3种类型…

mysql内存和磁盘的关系

mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上,但为了高效地执行查询操作,它也会将数据页(每个页通常为16KB)读入内存。MySQL的缓冲池(buffer pool)是在内存中的…

数据通信基本概念汇总

1. 数据通信基础 网关: 提供协议转换,路由选择,数据交换的网络设备 报文: 网络中所传递的一个数据单元。 数据载荷: 最终要传递的信息 封装: 给数据载荷添加头部和尾部的过程(形成新的报文) 解封装: 给数据载荷去掉头部和尾部的过程(获取数据载荷) 终端设…

JAVA语言开发的一套云HIS医院管理系统源码 HIS源码 医院管理系统源码 HIS系统是否可以与LIS和RIS进行集成

系统概述 云HIS系统是一种基于云计算的医疗卫生信息系统,它运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、处理的业务和技术平台。云HIS的主要功…

最简单的方式解决android studio 模拟器无法联网的问题

最简单的方式解决android studio 模拟器无法联网的问题 看了网上很多解决android studio内置模拟器无法联网的问题,基本上都是在模拟器手机上配置dns,个人试了多种办法也连不上网,现在给出一种,仅需要在命令行操作的解决安卓模拟…

在线预定酒店预约订房小程序源码系统 可轻松预定房间+随时取消预约 前后端分离 带网站的安装代码包以及搭建教程

系统概述 旅游业的快速发展和人们生活水平的不断提高,越来越多的人选择出行旅游。而在旅行过程中,酒店预订是一个必不可少的环节。传统的酒店预订方式往往需要用户通过电话、网站等渠道进行预订,流程繁琐,效率低下。为了解决这些…

Android15 Beta更新速览

Android15 Beta更新速览 前台服务变更 前台服务使应用保持活动状态,以便它们可以执行关键且对用户可见的操作,通常以牺牲电池寿命为代价。在 Android 15 Beta 2 中,dataSync 和 mediaProcessing 前台服务类型现在具有约 6 小时的超时时间&a…

【机器学习】探究DQN通过训练来解决AI序列决策问题

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum,防止连接镜像失败 yum -y update#卸载系统之前的docker(可选择,我这里直接注释了) #yum remove docker docker…

Geotools--生成等值线

好久没用geotools去写东西了&#xff0c;因为近几年一直在接触所谓数字孪生和可视化相关项目&#xff0c;个人的重心也往前端可视化去倾斜&#xff0c;在后端的开发上到变得停滞下来。 这次用的是geotools 28.4版本&#xff0c;生成等值线的方法在 <dependency><group…

html+CSS部分基础运用7

项目1 设计简易灯箱画廊 1.实验所需素材 在trees文件夹中提供一个MP3文件和18个JPG文件&#xff0c;设计页面时可以使用。 2.编程实现简易灯箱画廊&#xff0c;鼠标单击任一个图像超链接&#xff0c;在底部浮动框架中显示大图像&#xff0c;效果如图4-1所示的页面。 图4-1 简…

中创算力与中国移动初步达成战略合作意向,共同构建智能生态圈!

2024年5月14日&#xff0c;为进一步深化合作&#xff0c;促进业务共同发展&#xff0c;实现双方优势互补。中国移动云能力中心高级专家、郑州移动总经理助理邵根波、管城分公司政企部经理张文孟、航海东路分局张旭红莅临中创算力。中创董事长许伟威、副总经理杨光、技术总监刘朝…

Spring+SpringBoot面试总结(近两万字)

SpringSpringBoot面试总结 一、Spring Bean1.1、bean的生命周期&#xff08;对象的创建使用销毁&#xff09;1.1.1、准备工作1.1.2、创建Bean对象1.1.3、注册销毁 1.2、 bean的作用域1.2.1、配置方式 1.3、 spring 自动装配 bean 有哪些方式&#xff08;存疑存疑&#xff09;1.…

AI绘画Stable Diffusion【艺术写真】:蒙版法图生图,局部重绘实现AI艺术写真

大家好&#xff0c;我是设计师阿威 之前我分享过几篇使用SD插件换脸方式实现AI写真的教程&#xff0c;主要存在2个大的问题。 &#xff08;1&#xff09;人脸相似度 &#xff08;2&#xff09;生成的图片整体色调有时候会比较怪异 对于上面的问题&#xff0c;在对图片质量要…

条款9:利用destructors避免泄露资源

对指针说拜拜。承认吧&#xff0c;你从未真正喜欢过它&#xff0c;对不&#xff1f; 好&#xff0c;你不需要对所有指针说拜拜&#xff0c;但是你真的得对那些用来操控局部性资源(local resources&#xff09;的指针说莎唷娜拉了。 举个例子&#xff0c;你正在为“小动物收养…

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet32攻击&…