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

目录

前言:

生产者重连机制: 

生产者确认机制:

Publisher Confirm(生产者者确认)

Publish Return(发布返回)

总结:


前言:

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

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

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

生产者重连机制: 

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

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

spring:rabbitmq:connection-timeout: 1s  #设置超时时间template:retry:enabled: true #开启超时重试机制initial-interval: 1000ms #失败后的初始等待时间multiplier: 1 #失败后下次等待时长倍数,下次等待时长= Initial - interval * multipliermax-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() {@Overridepublic void handleAck(long deliveryTag, boolean multiple) {// 消息发送成功}@Overridepublic void handleNack(long deliveryTag, boolean multiple) {// 消息发送失败}
});

Publish Return(发布返回)

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

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

channel.addReturnListener(new ReturnListener() {@Overridepublic 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.mzph.cn/pingmian/17379.shtml

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

相关文章

【NumPy】关于numpy.divide()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

zabbix监控mysql

一、mysql数据库监控的内容有 mysql的吞吐量 mysql的常规操作(增删改查) QPS(Questions Per second:)每秒能处理多少次请求数 TPS(Transactions Per Second)每秒查询处理的事务数 mysql库大小和表大小 监控…

VsCode个人插件

Auto Rename Tag > 同时修改标签 Rainbow Brackets > 不同层级不同括号颜色 Dracula Official > 个人比较喜欢的一款主题 Error Lens > 错误信息显示 ES7REACT/Redux/React-Native>react开发插件 ESLINT Indenticator>方便看结构 Prettier Formatter …

欧科云链:Web3.0时代 具备链上数据分析能力的公司愈发凸显其价值

在当今激烈的市场竞争中,新兴互联网领域迅速崛起,Web2.0已相对成熟,用户创造数据,但不拥有数据。被视为新的价值互联网的Web3.0,赋予用户真正的数据自主权,它的到来被认为是打破Web2.0垄断的机遇。 在Web3…

迅狐跨境商城系统源码

在当今全球化的商业环境中,跨境电商的兴起为商家提供了无限的可能性。为了满足这一需求,跨境商城系统源码的开发显得尤为重要。本文将探讨跨境商城系统源码的优势,以及如何利用这些优势来构建一个成功的跨境电商平台。 独立开发,…

el-table 合并单元格_以合并属性值相同行为例

在做表格展示时&#xff0c;通常会遇到合并相同日期/id行的需求&#xff1b; <template><div><el-table:data"tableData":span-method"objectSpanMethod"borderstyle"width: 100%; margin-top: 20px"><el-table-column pr…

LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战

LLM 大模型学习必知必会系列(十三)&#xff1a;基于SWIFT的VLLM推理加速与部署实战 1.环境准备 GPU设备: A10, 3090, V100, A100均可. #设置pip全局镜像 (加速下载) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ #安装ms-swift pip install ms-…

windows11如何安装IIS

目录 IIS是什么&#xff1f; 为什么要配置IIS&#xff1f; 1.打开控制面板进入程序 2.点击启用或者关闭windos功能 3.勾选IIS相关的web项 4.点击确定等待一分钟程序变更即可 5.主页搜索internet 点击进入 6.进入IIS进行查看配置&#xff0c;并测试&#xff0c;也可以浏…

重学java 49 List接口

但逢良辰&#xff0c;顺颂时宜 —— 24.5.28 一、List接口 1.概述: 是collection接口的子接口 2.常见的实现类: ArrayList LinkedList Vector 二、List集合下的实现类 1.ArrayList集合的使用及源码分析 1.概述 ArrayList是List接口的实现类 2.特点 a.元素有序 —> 按照什么顺…

计算机视觉可视化工具SIBR使用方法

最近在跑实验时需要可视化3DGS/2DGS的重建后的图形界面&#xff0c;所以需要一个可视化工具&#xff0c;需要的软硬件要求如下&#xff1a; Hardware Requirements OpenGL 4.5-ready GPU and drivers (or latest MESA software)4 GB VRAM recommendedCUDA-ready GPU with Comp…

常见SSL证书品牌关系图

常见SSL证书品牌关系图 在SSL证书市场上&#xff0c;有几个主要的品牌和他们之间的复杂关系。以下是一些主要的SSL证书提供商及其关系的简要概述&#xff1a; DigiCert&#xff1a; DigiCert 是最大的SSL证书颁发机构之一。它收购了Symantec的SSL和PKI业务&#xff0c;其中包括…

深度合作!博睿数据联合中国信通院开展公网服务质量评估工作!

近日&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;算网质量保障工作全面启动&#xff0c;博睿数据&#xff08;bonree.com&#xff0c;股票代码688229&#xff09;作为信通院算网质量测试独家技术支持单位&#xff0c;提供公网服务质量测评整体解…

Linux之多进程

文章目录 c程序获取进程pid和ppid进程相关命令进程的创建多进程进程退出exit()函数_exit函数 进程的等待wait函数waitpid函数 进程的替换进程间的通信一、无名管道二、有名管道三、信号kill函数raise函数pause() 函数自定义信号处理函数SIGALARM信号子进程退出信号SIGCHLD 四、…

算法刷题day55:搜索(二)

目录 引言一、迷宫二、红与黑三、马走日四、单词接龙五、分成互质组六、小猫爬山七、数独八、木棒九、加成序列十、排书 引言 上篇文章主要是讲 B F S BFS BFS 的&#xff0c;主要应用在搜索中找最短路方面&#xff0c;主要就是在内部搜索&#xff0c;和整体搜索。而 D F S …

基于mybatis-plus的多语言扩展

概览 对于表中字段&#xff0c;需要实现多语言的方案探讨&#xff1a; 1.表中横向扩展多个字段分别存储中文&#xff0c;英文&#xff0c;俄语等语言字段&#xff0c;查询时&#xff0c;根据需要查询的语言&#xff0c;进行查询 2.增加一张多语言表&#xff0c;存储多语言信…

IC开发——VCS基本用法

1. 简介 VCS是编译型verilog仿真器&#xff0c;处理verilog的源码过程如下&#xff1a; VCS先将verilog/systemverilog文件转化为C文件&#xff0c;在linux下编译链接生成可执行文件&#xff0c;在linux下运行simv即可得到仿真结果。 VCS使用步骤&#xff0c;先编译verilog源…

深入理解Java中的ThreadLocal机制:原理、方法与使用场景解析

深入理解Java中的ThreadLocal机制&#xff1a;原理、方法与使用场景解析 ThreadLocal 是 Java 中提供的一种机制&#xff0c;用于在多线程环境下为每个线程提供独立变量副本&#xff0c;避免了线程间共享变量引发的并发问题。通过 ThreadLocal&#xff0c;每个线程都可以拥有自…

js面试题----3

61.new的原理是什么?通过new的方式创建对象和通过字面量创建有什么区别? new: 创建一个新对象。这个新对象会被执行[[原型]]连接。将构造函数的作用域赋值给新对象,即this指向这个新对象.如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。functio…

Nuxt2 控制路由导航方式

控制路由导航 1 在插件中使用 beforeEach 守卫 首先&#xff0c;创建一个插件文件&#xff0c;例如 router.js&#xff1a; export default ({ app, store }) > {app.router.beforeEach((to, from, next) > {if (to?.fullPath /buy/ && from?.fullPath /p…

STM32--ADC

一、简介 *ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 *ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 *12位逐次逼近型ADC&#xff0c;1us转换时间 *输入电压范围&#xff1a;0~3.3V&…