【从零开始学习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库大小和表大小 监控…

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

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

迅狐跨境商城系统源码

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

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

LLM 大模型学习必知必会系列(十三):基于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是什么? 为什么要配置IIS? 1.打开控制面板进入程序 2.点击启用或者关闭windos功能 3.勾选IIS相关的web项 4.点击确定等待一分钟程序变更即可 5.主页搜索internet 点击进入 6.进入IIS进行查看配置,并测试,也可以浏…

重学java 49 List接口

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

常见SSL证书品牌关系图

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

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

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

Linux之多进程

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

基于mybatis-plus的多语言扩展

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

IC开发——VCS基本用法

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

STM32--ADC

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

redisson 释放分布式锁 踩坑

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 48c213c9-1945-4c1b-821e-6d32e347eb44 thread-id: 69 出错代码: private void insertHourLog(Timestamp lastHourStartTimeStamp) {RLock lock red…

leetcode 1241每个帖子的评论数(postgresql)

需求 编写 SQL 语句以查找每个帖子的评论数。 结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 并且按 post_id 升序排列。 Submissions 可能包含重复的评论。您应该计算每个帖子的唯一评论数。 Submissions 可能包含重复的帖子。您应该将它们视为一个帖子。…

BI工具如何为金融行业带来变革?金融行业营销管理策略大揭秘

当今数字化时代,金融行业正经历着前所未有的变革。随着大数据、人工智能、区块链等新兴技术的兴起,金融机构正面临着重新定义服务模式、风险管理和客户体验的挑战。商业智能(BI)作为这一变革的关键驱动力,已经成为金融…

ComfyUI工作流网站

https://openart.ai/home https://comfyworkflows.com/ https://civitai.com/

claude3国内API接口对接

众所周知,由于地理位置原因,Claude3不对国内开放,而国内的镜像网站使用又贵的离谱! 因此,团队萌生了一个想法:为什么不创建一个一站式的平台,让用户能够通过单一的接口与多个模型交流呢&#x…

视频营销的智能剪辑:Kompas.ai如何塑造影响力视频内容

引言: 在当今数字化的营销领域,视频内容已经成为品牌吸引用户注意力、建立品牌形象和提升用户参与度的重要方式。然而,要想制作出具有影响力的视频内容,并不是一件容易的事情。这就需要借助先进的技术和工具,如人工智能…

2024开放式蓝牙耳机推荐,五款性价比最高的耳机推荐

在我们的日常生活中,无论是上下班通勤还是锻炼身体,耳机都是我们放松心情、驱散无聊的好伙伴。不过,面对市场上不断涌现的开放式蓝牙耳机,挑选一款既符合个人喜好又满足需求的产品,确实需要一些技巧。今天,…