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

【从零开始学习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将被触发,允许生产者对这种情况作出响应,比如进行重试或记录日志。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 信息抽取模型TPLinker
  • 入门四认识HTML
  • JAVA面试题大全(十六)
  • Python Requests库中data与json参数的区别
  • protobuf —— 快速上手
  • 算法课程笔记——素数朴素判定埃氏筛法
  • 队列(从数据结构的三要素出发)
  • MySQL(进阶)--索引
  • 【LSTM】基于Matlab的LSTM模型建模(代码)
  • 详解 QtAndroid::requestPermissionsSync
  • 防止特权升级攻击的有效策略
  • 【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
  • Facebook开户 | Facebook A/B测试:优化社媒广告效果的关键
  • MQ本地消息事务表
  • 二进制安装Kubernetes(k8s)v1.30.1
  • python3.6+scrapy+mysql 爬虫实战
  • FineReport中如何实现自动滚屏效果
  • Fundebug计费标准解释:事件数是如何定义的?
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JSDuck 与 AngularJS 融合技巧
  • Nodejs和JavaWeb协助开发
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • node学习系列之简单文件上传
  • PHP的类修饰符与访问修饰符
  • Vue.js源码(2):初探List Rendering
  • windows下使用nginx调试简介
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 给新手的新浪微博 SDK 集成教程【一】
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 小程序开发中的那些坑
  • 用jQuery怎么做到前后端分离
  • 再次简单明了总结flex布局,一看就懂...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #pragma 指令
  • #Spring-boot高级
  • $.ajax()参数及用法
  • (1)Jupyter Notebook 下载及安装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)Scala的“=”符号简介
  • (转载)虚函数剖析
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET C# 操作Neo4j图数据库
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容