RabbitMQ入门指南(七):生产者可靠性

专栏导航

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、消息丢失的可能性

1.发送消息时丢失:

2.MQ导致消息丢失:

3.消费者处理消息时消息丢失:

二、生产者可靠性

1.生产者重试机制

2.生产者确认机制

总结


前言

RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了消息丢失的可能性、生产者可靠性中的生产者重试机制和生产者确认机制等内容。


一、消息丢失的可能性

流程图如下:

1.发送消息时丢失:

  • 生产者发送消息时连接MQ失败:当生产者尝试与RabbitMQ建立连接但失败时,发送消息的操作将无法完成。这可能是由于网络问题、RabbitMQ服务未运行或配置错误导致的。

  • 生产者发送消息到达MQ后未找到Exchange:在RabbitMQ中,生产者将消息发送到Exchange,Exchange再路由到一个或多个Queue。如果生产者发送消息到达MQ后未找到正确的Exchange,那么消息将无法被路由到正确的Queue,从而丢失。

  • 生产者发送消息到达MQ的Exchange后,未找到合适的Queue:即使消息找到了Exchange,如果Exchange没有正确配置或没有找到合适的Queue来路由消息,那么消息也会丢失。这可能是由于配置错误或Queue不存在导致的。

  • 消息到达MQ后,处理消息的进程发生异常:在某些情况下,当消息到达MQ后,处理消息的进程可能会发生异常,导致消息无法被处理。这可能是由于代码错误、资源限制或其他系统问题导致的。

2.MQ导致消息丢失:

  • 消息到达MQ,保存到队列后,尚未消费就突然宕机:在某些情况下,如果RabbitMQ服务突然宕机,而消息已经保存到队列中但尚未被消费者消费,那么这些消息可能会丢失。为了防止这种情况,可以使用持久化配置来确保消息在MQ宕机后仍然保留在磁盘上。

3.消费者处理消息时消息丢失:

  • 消息接收后尚未处理突然宕机:如果消费者在接收消息后尚未处理就突然宕机,那么这些消息可能会丢失。为了防止这种情况,可以使用确认机制来确保消息在被消费者成功处理之前一直保留在队列中。

  • 消息接收后处理过程中抛出异常:在处理消息的过程中,如果消费者代码出现异常并抛出错误,那么可能会导致消息处理失败。为了防止这种情况,可以对消费者的代码进行充分的测试和异常处理,以确保其能够正确、稳定地处理消息。

二、生产者可靠性

1.生产者重试机制

由于网络波动,可能会出现客户端连接MO失败的情况,为了解决这个问题,Spring AMQP提供了消息发送时的重试机制 。

在publisher服务的application.yml文件中添加配置:

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

当网络不稳定时,重试机制可以有效提高消息发送的成功率。然而,Spring AMQP提供的重试机制是阻塞式的,这意味着在等待重试的过程中,当前线程会被阻塞。对于对业务性能有要求的应用,建议禁用重试机制。如果仍需使用,建议合理配置等待时长和重试次数,并考虑使用异步线程来执行发送消息的代码,以避免阻塞主线程。

2.生产者确认机制

RabbitMQ提供了Publisher ConfirmPublisher Return两种确认机制。开启确机制认后,当生产者发送消息给MQ后,MQ会根据消息处理的情况返回不同的回执。返回的结果有以下几种情况:

  • 消息投递到了MQ,但是路由失败。此时会通过PublisherReturn返回路由异常原因,然后返回ACK,告知投递成功。
  • 临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功。
  • 持久消息投递到了MQ,并且入队完成持久化,返回ACK,告知投递成功。
  • 其他情况都会返回NACK,告知投递失败。

ACK和NACK属于Publisher Confirm机制,ACK是投递成功,NACK是投递失败。return属于Publisher Return机制。默认两种机制都是关闭状态,需要通过配置文件来开启。

开启生产者确认:

在publisher服务的application.yml文件中添加配置:

spring:rabbitmq:publisher-confirm-type: correlated     # 开启publisher confirm机制,并设置confirm类型publisher-returns: true     # 开启publisher return机制

publisher-confirm-type有三种模式(一般推荐使用correlated回调机制):

  • none:关闭confirm机制
  • simple:同步阻塞等待MQ的回执
  • correlated:MQ异步回调返回回执

定义ReturnCallback:

在publisher服务定义一个配置类(每个RabbitTemplate只能配置一个ReturnCallback):

@Slf4j
@Configuration
public class MqConfirmConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 配置回调rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returned) {log.info("消息的return callback:");log.info("exchange:{}, key:{}, msg:{}, code:{}, text:{}",returned.getExchange(), returned.getRoutingKey(), returned.getMessage(), returned.getReplyCode(), returned.getReplyText());}});}
}

定义ConfirmCallback:

由于每条消息的处理逻辑可能不同,因此需要在每次发送消息时定义ConfirmCallback(当调用RabbitTemplate的convertAndSend方法时,需要多传递一个参数)。

这个参数是一个CorrelationData对象,包含两个核心内容:

  • id:这是消息的唯一标识,MQ会使用它来判断不同的消息的回执,避免混淆。
  • SettableListenableFuture:这是一个Future对象,MQ将通过它返回回执结果。可以提前为CorrelationData中的Future添加回调函数来处理消息回执。

在publisher服务中的测试类添加一个测试方法,实现消息发送,并且添加ConfirmCallback:

    @Testvoid testConfirmCallback() throws InterruptedException {// 1.创建CorrelationDataCorrelationData cd = new CorrelationData(UUID.randomUUID().toString());// 2.添加ConfirmCallbackcd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable ex) {log.error("消息回调失败", ex);}@Overridepublic void onSuccess(CorrelationData.Confirm result) {log.debug("收到confirm callback回执");if (result.isAck()) {// 消息发送成功log.debug("消息发送成功,收到ACK");} else {// 消息发送失败log.error("消息发送失败,收到NACK,原因:{}", result.getReason());}}});rabbitTemplate.convertAndSend("test.direct", "red", "test", cd);}

生产者确认会带来额外的网络和系统资源开销,因此应尽量避免使用。如果确实需要使用,则无需开启Publisher-Return机制,因为一般路由失败是业务问题。对于NACK消息,可以有限次数重试,如果仍然失败,则记录异常消息。


总结

RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了消息丢失的可能性、生产者可靠性中的生产者重试机制和生产者确认机制等内容,希望对大家有所帮助。

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

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

相关文章

Plantuml之对象图语法介绍(十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

VSCode运行时弹出powershell

问题 安装好了vscode并且装上code runner插件后&#xff0c;运行代码时总是弹出powershell,而不是在vscode底部终端 显示运行结果。 解决方法 打开系统cmd ,在窗口顶部条右击打开属性&#xff0c;把最下面的旧版控制台选项取消&#xff0c;即可

Flink系列之:Checkpoints 与 Savepoints

Flink系列之&#xff1a;Checkpoints 与 Savepoints 一、概述二、功能和限制 一、概述 从概念上讲&#xff0c;Flink 的 savepoints 与 checkpoints 的不同之处类似于传统数据库系统中的备份与恢复日志之间的差异。 Checkpoints 的主要目的是为意外失败的作业提供恢复机制。 …

【Hadoop】Zookeeper是什么?怎么理解它的工作机制?

Zookeeper是什么Zookeeper工作机制 Zookeeper是什么 Zookeeper是一个开源的分布式的&#xff0c;为别的分布式矿建提供协调服务的Apache项目。分布式简单地理解就是多台机器共同完成一个任务。 Zookeeper工作机制 从设计模式的角度来理解&#xff0c;是一个基于观察者模式设…

LV.13 D6 Linux内核安装及交叉编译 学习笔记

一、tftp加载Linux内核及rootfs 1.1 uboot内核启动命令 bootm 启动指定内存地址上的Linux内核并为内核传递参数 bootm kernel-addr ramdisk-addr dtb-addr 注: kernel-addr: 内核的下载地址 ramdisk-addr: 根文件系统的下载地址 …

postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升

最近遇到一个问题&#xff0c;就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次&#xff0c;觉得麻烦就让后端换了种方式处理了&#xff0c;昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B&#xff0c;而且这两个网页…

工具系列:PyCaret介绍_Fugue 集成_Spark、Dask分布式训练

文章目录 1、分布式计算场景&#xff08;1&#xff09;分类&#xff08;2&#xff09;回归&#xff08;3&#xff09;时间序列 2、分布式应用技巧(1)一个更实际的案例(2) 在设置中使用lambda而不是dataframe(3) 保持确定性(4) 设置n_jobs(4)设置适当的批量大小(5) 显示进度(6)自…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

Unity新动画系统之动画层和动画遮罩

Unity新动画系统之动画层和动画遮罩 一、介绍二、动画骨骼遮罩层使用第一种就是create一个avatar Mask,如下&#xff1a;第二种遮罩&#xff0c;就是直接在动画剪辑的属性上更改&#xff0c;如图一为humanoid类型的动画剪辑属性&#xff1a; 一、介绍 之前分享过FSM动画控制系…

Python算法例25 落单的数Ⅲ

1. 问题描述 给出2n2个非负整数元素的数组&#xff0c;除其中两个数字之外&#xff0c;其他每个数字均出现两次&#xff0c;找到这两个数字。 2. 问题示例 给出[1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;4&#xff0c;5&#xff0c;3]&#xff0c…

小白也能搞定的Python选择排序

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 小白也能搞定的Python选择排序。全文3300字&#xff0c;阅读大约10分钟 选择排序&#xff08;Selection Sort&#xff09;是一种简单但有效的排序算法&#xff0c;它通过逐步…

掌握函数式组件:迈向现代化前端开发的关键步骤(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

数据孤岛:一场数据的独立战争

在当今数字化的时代&#xff0c;数据已成为企业和组织最宝贵的资产之一。然而&#xff0c;尽管数据的价值被广泛认可&#xff0c;但数据的分散和孤立问题却仍然存在&#xff0c;这就是所谓的数据孤岛。本文将重点分析什么是数据孤岛、数据孤岛的危害以及解决数据孤岛的传统和创…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器&#xff0c;强悍的性能远超苹果的iTunes&#xff0c;iMazing 能让广大果粉能已自己的方式管理苹果设备&#xff0c;无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

在使用 npm install的时候提示node-sass command faile 解决方案

在使用npm install的时候错误提示node-sass 相关的。错误信息如下图&#xff1a; 解决方法&#xff08;PS&#xff1a;凯哥的不适用&#xff09; 出现这种问题基本是由于node版本与sass版本不匹配导致的 方案1&#xff1a;卸载node&#xff0c;安装对应版本 方案2&#xff1…

2023最新轻松升级、安装和试用Navicat Premium 16.3.3 教程详解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Java进阶九—数组问题(集合框架)

Java进阶九—数组问题(集合框架) 一.原生数组带来的问题 原生数组容易造成超出边界&#xff0c;如果非要使用传统的数组&#xff0c;增删改查&#xff0c;就要用到数据结构&#xff0c;非常复杂CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(…

Mac如何配置Java环境

想必很多小伙伴会遇到配置Java环境的情况&#xff0c;今天就跟大家一起分享下我的安装过程&#xff0c;记录一下也是留给需要的小伙伴学习 一、下载和安装JDK 登录OracleJDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;或者OpenJDK官网…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂&#xff0c;升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段&#xff0c;并详细探讨IP地址过滤的策略&#xff0c;以提升网络的安全性。 第一部分&#xff1a;反网络爬虫的三…