RabbitMQ 发布确认模式
RabbitMQ 发布确认模式
一、原理
RabbitMQ 的发布确认模式(Publisher Confirms)是一种机制,用于确保消息在被 RabbitMQ 服务器成功接收后,发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要,能够有效防止消息丢失。
在发布消息时,RabbitMQ 会向发布者返回确认信号,指示该消息已成功处理。这一过程可以大大提高消息传递的可靠性,尤其是在系统出现故障时。通过实现发布确认模式,发布者可以确保所有发送的消息都已被服务器接收并存储,从而维护数据一致性。
二、三种方式比较
1. 单个确认
单个确认模式是指每发送一条消息,发布者都会等待 RabbitMQ 发送确认信号。这种方式简单易懂,但在高负载场景下,性能表现可能较差,因为每条消息都需要等待确认,造成延迟。
优点:
- 实现简单,易于理解和使用。
- 适合消息量较小的场景。
缺点:
- 性能较低,确认过程中的延迟会影响整体吞吐量。
public static void publishMessageIndividually() throws Exception {Channel channel = RabbitMqUtils.getChannel();String queue_name = UUID.randomUUID().toString();channel.queueDeclare(queue_name,false,false,false,null);//开始时间long begin = System.currentTimeMillis();channel.confirmSelect();for (int i = 0; i < message_count; i++) {String message = i+"";channel.basicPublish("",queue_name,null,message.getBytes());//单个消息马上确认boolean flag = channel.waitForConfirms();if(flag == true){System.out.println("消息发送成功");}}//结束时间long end = System.currentTimeMillis();System.out.println("发布"+message_count+"条用时:"+(end - begin)+"mills");}
2. 批量确认
批量确认模式允许发布者在发送多条消息后,一次性等待 RabbitMQ 的确认信号。通过将多条消息组合在一起进行确认,可以显著提高消息发布的效率。
优点:
- 显著提高吞吐量,减少网络延迟。
- 适合需要高性能的场景。
缺点:
-
需要管理确认逻辑,稍微复杂。
-
一旦发生错误,可能需要重新发送整个批次的消息。
//批量发布确认public static void publishMessageBatch() throws Exception {Channel channel = RabbitMqUtils.getChannel();String queue_name = UUID.randomUUID().toString();channel.queueDeclare(queue_name,false,false,false,null);channel.confirmSelect();//开始时间long begin = System.currentTimeMillis();//批量确认的长度int basicSize = 100;for (int i = 1; i <= message_count; i++) {String message = i+"";channel.basicPublish("",queue_name,null,message.getBytes());if(i%basicSize == 0){System.out.println("消息发送成功");channel.confirmSelect();}}//结束时间long end = System.currentTimeMillis();System.out.println("批量发布"+message_count+"条用时:"+(end - begin)+"mills");}
3. 异步批量确认
异步批量确认模式更进一步,发布者在发送批量消息后,不必等待 RabbitMQ 的确认信号,而是可以继续发送更多消息。RabbitMQ 在后台处理确认,这样可以进一步提高效率。
优点:
- 最高的性能和吞吐量,几乎没有延迟。
- 发布者可以充分利用 CPU 和网络资源。
缺点:
- 实现复杂度增加,需要处理可能出现的消息丢失。
- 需要额外的逻辑来确保消息的可靠性。
//异步发布确认public static void publishMessageAsync() throws Exception {Channel channel = RabbitMqUtils.getChannel();String queue_name = UUID.randomUUID().toString();channel.queueDeclare(queue_name,false,false,false,null);//开启发布确认channel.confirmSelect();/*** 线程安全有序的哈希表 适用于高并发* 1、将序号和消息关联* 2、轻松删除条目,主要给到序号* 3、支持高并发*/ConcurrentSkipListMap<Long, String> outstandingConfirms = new ConcurrentSkipListMap<>();//开始时间long begin = System.currentTimeMillis();//消息确认成功的回调ConfirmCallback ackCallBack = (deliveryTag, multiple)->{//2:删除确认的消息if(multiple){ConcurrentNavigableMap<Long,String> confirmed =outstandingConfirms.headMap(deliveryTag);confirmed.clear();}else {outstandingConfirms.remove(deliveryTag);}System.out.println("确认消息:"+deliveryTag);};/*** 1、消息类型* 2、是否批量*/ConfirmCallback NackCallBack = (deliveryTag, multiple)->{//3:打印未确认的String message = outstandingConfirms.get(deliveryTag);System.out.println("发布的消息"+message+"未被确认,序列号"+deliveryTag);};//准备消息的监听器//1.监听成功的//2.监听失败的channel.addConfirmListener(ackCallBack,NackCallBack);for (int i = 1; i <= message_count; i++) {String message = i+"";channel.basicPublish("",queue_name,null,message.getBytes());//1:此处记录所有要发送的消息outstandingConfirms.put(channel.getNextPublishSeqNo(),message);}//结束时间long end = System.currentTimeMillis();System.out.println("批量发布"+message_count+"条用时:"+(end - begin)+"mills");}
三、速度对比
三种时间对比:



在速度和吞吐量方面,三种模式各有优势。一般来说,单个确认模式的速度最慢,而异步批量确认模式则能提供最佳性能。在实际应用中,选择合适的确认模式应根据业务需求、消息量以及系统的可承受负载来综合考虑。
发布确认模式为 RabbitMQ 提供了灵活的消息发布保障机制。根据具体需求选择合适的确认方式,将有助于实现高效、可靠的消息传递系统。
相关文章:
RabbitMQ 发布确认模式
RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式(Publisher Confirms)是一种机制,用于确保消息在被 RabbitMQ 服务器成功接收后,发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要,能够有效防止…...
【面试题】什么是SpringBoot以及SpringBoot的优缺点
什么是SpringBoot以及SpringBoot的优缺点 什么是SpringBoot SpringBoot是基于Spring的一个微框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 SpringBoot的优点 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执…...
git区分大小写吗?如果不区分,那要如何设置?
git区分大小写吗?如果不区分,那要如何设置? "Git在文件名的大小写方面是区分大小写的,但在某些操作系统(如Windows和macOS)上,文件系统默认是不区分大小写的。这可能导致一些问题…...
Docker 安装使用
1. 下载 下载地址:Index of linux/static/stable/x86_64/ 下载好后,将文件docker-18.06.3-ce.tgz用WinSCP等工具,上传到不能外网的linux系统服务器 2. 安装 解压后的文件夹docker中文件如下所示: 将docker中的全部文件ÿ…...
Linux Docker配置镜像加速
Docker配置常用镜像加速地址包含阿里、腾讯、百度、网易 1. 编辑docke配置文件 vim /etc/docker/daemon.json写入以下内容 {"registry-mirrors": ["https://docker.mirrors.aliyuncs.com","https://registry.docker-cn.com","https://mi…...
了解CSS Typed OM
CSS Typed OM(CSS Typed Object Model)是一项前沿的技术,旨在改变我们编写和操作CSS的方式。以下是对CSS Typed OM的详细解析: 一、CSS Typed OM概述 CSS Typed OM是一个包含类型和方法的CSS对象模型,它暴露了作为Ja…...
[ 钓鱼实战系列-基础篇-6 ] 一篇文章让你了解邮件服务器机制(SMTP/POP/IMAP)-2
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
在 Docker 中搭建 PostgreSQL16 主从同步环境
1. 环境搭建 本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库,详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebacku…...
SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)
TOC 问题背景 从零开始学springcloud微服务项目 注意事项: 约定 > 配置 > 编码IDEA版本2021.1这个项目,我分了很多篇章,每篇文章一个操作步骤,目的是显得更简单明了controller调service,service调dao默认安装ngi…...
判断浏览器环境,前端打开微信浏览器
我们知道微信浏览器有自带针对微信的组件(比如:微信JSAPI支付使用的WeixinJSBridge),那么,有办法在普通浏览器中打开微信浏览器并跳转页面吗?(似乎微信已禁用外部浏览器调用的普通页面直接跳转,只能通过“weixin://前缀…...
【算法笔记】前缀和算法原理深度剖析(超全详细版)
【算法笔记】前缀和算法原理深度剖析(超全详细版) 🔥个人主页:大白的编程日记 🔥专栏:算法笔记 文章目录 【算法笔记】前缀和算法原理深度剖析(超全详细版)前言一.一维前缀和1.1题…...
linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架
一、arp 的作用 ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知…...
经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】
题目理解 我们要在给定的股票价格数组 prices 中进行买卖操作,并尽可能多次交易以获取最大利润。每次交易都需要支付一定的手续费 fee,因此我们必须考虑如何通过合适的交易策略最大化利润。 在本题中,每一天可以选择: 不进行任…...
Python画笔案例-088 绘制 滚动的汉字
1、绘制 滚动的汉字 通过 python 的turtle 库绘制 滚动的汉字,如下图: 2、实现代码 绘制 滚动的汉字,以下为实现代码: """滚动的汉字.py """ import time from turtle import * from write_patch import *width,height...
Redis 5.0 安装配置(Windows)
Redis 5.0之后支持Redis Stream等功能 下载地址:Releases tporadowski/redis GitHub 点击运行redis-server.exe 此外:Redis 6.0及以后版本目前都没有Windows版...
金融行业:办公安全防护专属攻略
在中国金融市场快速迈向数字化转型的进程中,数据安全与隐私保护成为了不容忽视的关键议题。面对不断升级的网络威胁和日益严格的监管要求,构建一个既能支持创新又能提供坚实防护的信息安全体系变得尤为重要。亿格云不断深耕办公安全领域,为金…...
python如何基于numpy pandas完成复杂的数据分析操作?
数据分析是现代数据科学的重要组成部分,Python作为一种强大的编程语言,提供了许多库来简化数据分析过程。 其中,NumPy和Pandas是两个最常用的库。NumPy主要用于数值计算,而Pandas则提供了强大的数据结构和数据分析工具。 本文将深入探讨如何利用这两个库进行复杂的数据分…...
Linux中定时任务调度工具——crontab
1.简介 crontab是Unix和类Unix操作系统(如Linux)中用于定时任务调度的工具。其名称来源于“cron”这个守护进程,它负责周期性地执行任务,并且“tab”表示这个工具的配置文件。用户可以通过配置crontab文件来设定定时任务…...
思维+差分,CF 1884C - Medium Design
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1884C - Medium Design 二、解题报告 1、思路分析 考虑 最大值 和 最小值…...
简单介绍冯诺依曼体系
现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器:进行算术运算和逻辑判断。存储器:分为外存和内存,用于存储数据(使用二进制方式存储)。输入设备:用户给计算机发号施令。输出设备:计算机…...
从单体到微服务:用Ruoyi-Vue-Plus框架快速搭建多租户后台系统(含AI模块开发避坑指南)
从单体到微服务:Ruoyi-Vue-Plus框架的多租户实战与AI模块开发精要 当企业级应用需要同时服务多个客户群体时,如何确保数据隔离与系统性能的平衡成为架构设计的核心挑战。Ruoyi-Vue-Plus作为一款基于Spring Boot的快速开发框架,其多租户实现机…...
基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排
基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排 1. 引言:当图像生成遇上智能体 想象一下这样的场景:你需要为电商平台制作一组节日主题的广告图,包含特定风格的背景、商品展示和人物互动…...
FlowState Lab模型微调教程:使用自定义数据集训练专属波动模型
FlowState Lab模型微调教程:使用自定义数据集训练专属波动模型 1. 学习目标与前置准备 想为特定领域打造专属的波动预测模型吗?本文将带你完成从数据准备到模型评估的全流程。学完本教程,你将能够: 准备符合要求的时序/空间序列…...
OpCore-Simplify:让黑苹果配置从复杂到简单的智能化革命
OpCore-Simplify:让黑苹果配置从复杂到简单的智能化革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾为黑苹果(Hac…...
Vue 3 Teleport:打破 DOM 层级的“传送门”
Vue 3 Teleport:打破 DOM 层级的“传送门” 在现代前端开发中,组件化是构建复杂用户界面的基石。我们习惯于将 UI 拆分成一颗颗独立的组件,像搭积木一样组合成完整的页面。然而,这种嵌套结构在带来逻辑内聚性的同时,也…...
保姆级教程:用snntorch在MNIST上训练你的第一个脉冲神经网络(附完整代码)
从零开始:用snntorch构建你的第一个脉冲神经网络手记 第一次接触脉冲神经网络(SNN)时,我被它模拟生物神经元放电的特性深深吸引。与传统人工神经网络不同,SNN通过离散的脉冲信号传递信息,更接近人脑的工作机…...
[工业级协议]开发指南:从协议兼容性到实时通信的5步解决方案
[工业级协议]开发指南:从协议兼容性到实时通信的5步解决方案 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 副标题&a…...
Python AI 用例工具部署踩坑实录:Docker镜像体积暴增300%、GPU显存泄漏、模型热加载失败的5个根因与秒级修复方案
第一章:Python AI 用例工具部署的典型失败图谱在真实生产环境中,Python AI 工具链(如 LangChain、LlamaIndex、FastAPI 封装的推理服务)的部署失败往往并非源于模型能力缺陷,而是由基础设施、依赖冲突与配置漂移引发的…...
Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本
Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本 你是不是也遇到过这样的烦恼?好不容易在本地电脑上,用Realistic Vision V5.1模型调出了一套完美的参数组合,生成的人像照片质感堪比专业影棚。结果换台电脑…...
CMake+vcpkg环境配置避坑指南:从命令行到GUI的完整流程
CMakevcpkg环境配置避坑指南:从命令行到GUI的完整流程 刚接触C/C开发的工程师们,往往会在环境配置阶段经历"从入门到放弃"的心路历程。面对复杂的依赖库管理、跨平台编译问题,以及各种晦涩的错误提示,不少开发者甚至还没…...
