RabbitMQ 如何设置限流?
RabbitMQ 的限流(流量控制)主要依赖于 QoS(Quality of Service) 机制,即 prefetch count 参数。这个参数控制每个消费者一次最多能获取多少条未确认的消息,从而避免某个消费者被大量消息压垮。
1. RabbitMQ 限流的主要方式
(1) 基于 prefetch count 进行流量控制
作用:控制 RabbitMQ 一次最多发送多少条消息 给消费者,避免消费者积压太多消息导致内存爆炸。
- 默认情况下,RabbitMQ 会源源不断地向消费者推送消息,直到消费者崩溃。
prefetch count设为 1,表示消费者一次只获取 1 条消息,处理完再取下一条。
示例(Java Spring Boot 版):
// 生产者 - 用户抢购
public void sendSeckillRequest(String userId, String productId) {String message = userId + "," + productId;rabbitTemplate.convertAndSend("seckillQueue", message);
}// 消费者 - 处理秒杀
@RabbitListener(queues = "seckillQueue", containerFactory = "customContainerFactory")
public void handleSeckillRequest(Message message, Channel channel) throws IOException {try {String msg = new String(message.getBody(), StandardCharsets.UTF_8);System.out.println("收到秒杀请求:" + msg);// 模拟秒杀业务处理Thread.sleep(1000);// 手动ACK,表示消息已消费完成channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {// 处理失败时拒绝消息,并放回队列channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);}
}
对应的RabbitMQ 配置(限制 prefetch count):
@Bean
public SimpleRabbitListenerContainerFactory customContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 手动ACKfactory.setPrefetchCount(1); // **每次只取 1 条消息**return factory;
}
这样可以限制 RabbitMQ 一次最多给每个消费者发送 1 条消息,等它处理完了才会发送下一条。
(2) 基于 x-max-length 限制队列长度
作用:限制消息队列的最大长度,超出部分的消息会被丢弃。
示例(Java 代码方式创建队列,并限制最大长度 1000):
@Bean
public Queue seckillQueue() {return QueueBuilder.durable("seckillQueue").withArgument("x-max-length", 1000) // **最多存 1000 条消息**.build();
}
这样,RabbitMQ 最多存 1000 条秒杀请求,超出的会自动丢弃,避免无限堆积。
(3) 基于 x-message-ttl 限制消息存活时间
作用:让 RabbitMQ 的消息有过期时间,超时未消费的消息会被删除。
示例(Java 代码方式):
@Bean
public Queue seckillQueue() {return QueueBuilder.durable("seckillQueue").withArgument("x-message-ttl", 5000) // **5 秒后未消费,自动删除**.build();
}
这样,RabbitMQ 超过 5 秒未消费的消息会自动删除,避免秒杀请求无限堆积。
(4) 基于 x-max-priority 设置优先级队列
作用:高优先级的消息先被消费。
示例(Java 代码方式):
@Bean
public Queue seckillQueue() {return QueueBuilder.durable("seckillQueue").withArgument("x-max-priority", 10) // **优先级范围 0-10**.build();
}
生产者在发送消息时,可以为每条消息指定优先级:
rabbitTemplate.convertAndSend("seckillQueue", "普通用户秒杀请求", message -> {message.getMessageProperties().setPriority(1); // 普通用户优先级低return message;
});rabbitTemplate.convertAndSend("seckillQueue", "VIP 用户秒杀请求", message -> {message.getMessageProperties().setPriority(9); // VIP 用户优先级高return message;
});
优先级范围:0~10(具体取决于队列的 x-max-priority 设置)。
0表示最低优先级10表示最高优先级- RabbitMQ 会优先发送高优先级的消息给消费者。
这样,RabbitMQ 支持优先级消息,比如可以让 VIP 用户的秒杀请求优先处理。
2. 结合多个限流策略优化秒杀系统
在高并发秒杀场景下,RabbitMQ 限流可以这样设计:
| 限流方式 | 作用 |
|---|---|
prefetch count = 1 | 限制消费者一次最多消费 1 条消息,防止消息处理过载。 |
x-max-length = 1000 | 限制队列最大存储 1000 条消息,超出的直接丢弃,防止消息堆积。 |
x-message-ttl = 5000 | 超过 5 秒未消费的秒杀请求自动删除,避免系统长时间积压请求。 |
x-max-priority = 10 | 支持优先级消息,比如 VIP 用户的消息先消费。 |
这样能有效防止 RabbitMQ 队列爆炸,保护数据库,提升秒杀成功率。
3. 总结
✅ 基于 prefetch count 限制消费速率,防止消费者被消息压垮。
✅ 基于 x-max-length 限制队列最大长度,防止秒杀请求无限堆积。
✅ 基于 x-message-ttl 让过期消息自动删除,避免长时间存积压请求。
✅ 基于 x-max-priority 提高 VIP 用户的处理优先级,提升体验。
这些策略组合使用,可以大幅提升RabbitMQ 在秒杀系统中的稳定性和吞吐能力
相关文章:
RabbitMQ 如何设置限流?
RabbitMQ 的限流(流量控制)主要依赖于 QoS(Quality of Service) 机制,即 prefetch count 参数。这个参数控制每个消费者一次最多能获取多少条未确认的消息,从而避免某个消费者被大量消息压垮。 1. RabbitMQ…...
json格式,curl命令,及轻量化处理工具
一. JSON格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于一个子集的JavaScript编程语言,使用人类易于阅读的文本格式来存储和表示数据。尽管名字中有“JavaScript”,但JSON是语言无关的,几…...
Postman面试问题
在 API 测试领域,Postman 已成为最流行的工具之一。无论是功能测试、自动化测试,还是接口调试,Postman 都扮演着重要角色。而在软件测试面试中,Postman 相关问题更是高频考点。如果你正在准备面试,赶紧看看这些Postman…...
【JVM详解四】执行引擎
一、概述 Java程序运行时,JVM会加载.class字节码文件,但是字节码并不能直接运行在操作系统之上,而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…...
esp32 udp 客户端 广播
esp32 udp 客户端 广播 #include "bsp_udpc.h"// #include "com_config.h" // #include "com_xqueue.h"#include "bsp_udpc.h" #define TAG "bsp_udpc"#include <string.h> #include <sys/param.h> #include &q…...
nginx日志存储access日志和error保留180天,每晚把前一天的日志文件压缩成tar.gz
logrotate日志分割时,rotate参数是必须要加的 在logrotate的配置文件中,rotate参数用于指定保留的旧日志文件数量。如果不配置rotate参数,默认是0个,也就是只允许存在一份日志,刚切分出来的日志会马上被删除 l…...
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
文章目录 四、阻塞队列1、基础概念1.1 生产者消费者概念1.2 JUC阻塞队列的存取方法 2、ArrayBlockingQueue2.1 ArrayBlockingQueue的基本使用2.2 生产者方法实现原理2.2.1 ArrayBlockingQueue的常见属性2.2.2 add方法实现2.2.3 offer方法实现2.2.4 offer(time,unit)方法2.2.5 p…...
C#控件开发6—旋转按钮
按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边); 【制作方法】 找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得; 【关…...
在亚马逊云科技上云原生部署DeepSeek-R1模型(下)
在本系列的上篇中,我们介绍了如何通过Amazon Bedrock部署并测试使用了DeepSeek模型。在接下来的下篇中小李哥将继续介绍,如何利用亚马逊的AI模型训练平台SageMaker AI中的,Amazon Sagemaker JumpStart通过脚本轻松一键式部署DeepSeek预训练模…...
C# COM 组件在.NET 平台上的编程介绍
.NET学习资料 .NET学习资料 .NET学习资料 一、COM 组件简介 COM(Component Object Model)即组件对象模型,是一种微软提出的软件组件技术,它允许不同的软件模块在二进制层面进行交互。COM 组件可以用多种编程语言开发࿰…...
火热的大模型: AIGC架构解析
文章目录 一、背景介绍二、架构描述数据层模型层(MaaS)服务层(PaaS)基础设施层(IaaS)应用层 三、架构分析四、应用场景与价值4.1 典型场景4.2 价值体现 五、总结 一、背景介绍 火热的大模型,每…...
Android LifecycleOwner 闪退,java 继承、多态特性!
1. 闪退 同意隐私政策后,启动进入游戏 Activity 闪退 getLifecycle NullPointerException 空指针异常 FATAL EXCEPTION: main Process: com.primer.aa.gg, PID: 15722 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.primer.aa.…...
PHP 完整表单实例
PHP 完整表单实例 引言 表单是网站与用户交互的重要方式,尤其是在收集用户输入数据时。PHP 作为一种流行的服务器端脚本语言,在处理表单数据方面具有强大的功能。本文将提供一个完整的 PHP 表单实例,涵盖表单创建、数据收集、验证和存储等关…...
深度学习学习笔记(32周)
目录 摘要 abstract 1 Mask R-CNN 2 RoI Align 2.1 RoIPool实验 2.2 RoIAlign实验 3 Mask Branch(FCN) 4 其他细节 4.1 Mask R-CNN损失 4.2 Mask分支损失 4.3 Mask Branch预测使用 摘要 Mask R-CNN是2017年发表的文章,一作是何恺明大神,没错就…...
Web3 开发者的机遇与挑战:技术趋势与职业发展
随着 Web3 技术的迅速发展,互联网的未来正朝着去中心化、用户主权、隐私保护等方向演进。作为 Web3 生态的核心力量,Web3 开发者在推动这一变革中扮演着至关重要的角色。无论是在区块链技术、智能合约开发、去中心化应用(DApp)的构…...
探索robots.txt:网站管理者的搜索引擎指南
在数字时代,网站如同企业的在线名片,其内容和结构对搜索引擎的可见性至关重要。而在这背后,有一个默默工作的文件——robots.txt,它扮演着搜索引擎与网站之间沟通桥梁的角色。本文将深入探讨robots.txt的功能、编写方法及其在现代…...
LM Studio本地调用模型的方法
首先需要下载LM Studio,(LM Studio - Discover, download, and run local LLMs)安装好后,需要对index.js文件进行修改,主要是对相关源hugging face的地址修改。 以macOS为例: cd /Applications/LM\ Studi…...
防火墙安全综合实验
防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一:根据下表,完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List:10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…...
uniapp 编译生成鸿蒙正式app步骤
1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…...
【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。 首先&a…...
STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功
STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时,我花了整整三天时间在Proteus里调试仿真,结果连最基本的电机转动都实现不了。直到把电路搬到实物上,才发现仿真环境里那些看似…...
YOLO12入门必看:从上传图片到JSON结果输出完整操作流程
YOLO12入门必看:从上传图片到JSON结果输出完整操作流程 1. 引言:为什么你需要了解YOLO12? 如果你正在寻找一个既快又准的目标检测工具,那么YOLO12的出现,可能就是你一直在等的那个答案。 想象一下这样的场景&#x…...
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型 1. 前言:为什么选择本地部署? 在个人电脑上运行大语言模型听起来可能有些遥不可及,但随着模型量化技术的进步,现在即使是消费级显卡也能流畅运行14B参数…...
终极Win11Debloat优化指南:简单4步让你的Windows 11飞起来
终极Win11Debloat优化指南:简单4步让你的Windows 11飞起来 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
别再死记硬背GAT公式了!用Python+PyTorch手把手图解注意力机制(附代码)
图解GAT:用PythonPyTorch拆解图注意力机制的实现奥秘 当你第一次听说图注意力网络(GAT)时,是否被那些复杂的数学公式和抽象概念吓退?本文将以全新的可视化方式,带你从零实现一个完整的GAT层,用代…...
从零构建树莓派人脸识别门禁:硬件选型、环境部署与实战避坑
1. 硬件选型与采购清单 第一次玩树莓派人脸识别项目时,我在淘宝上花了整整三天对比各种硬件参数。当时最纠结的就是摄像头模块——普通USB摄像头才30块钱,而官方推荐的Raspberry Pi Camera Module V2要200多。后来实测发现,这差价真不能省。 …...
开源小模型也能干大事:MinerU图文理解实战教程
开源小模型也能干大事:MinerU图文理解实战教程 1. 项目简介 OpenDataLab MinerU 是一个专门针对文档理解设计的智能多模态模型,基于 OpenDataLab/MinerU2.5-1.2B 模型构建。虽然只有 1.2B 参数,但这个模型在文档解析方面表现出色࿰…...
卷积计算常见误区解析:为什么你的结果和理论值对不上?
卷积计算常见误区解析:为什么你的结果和理论值对不上? 在图像处理和深度学习领域,卷积操作是基础中的基础。但令人惊讶的是,即使是经验丰富的开发者,在实际编码时也常常遇到计算结果与预期不符的情况。这就像做菜时严格…...
第二章 从ROM到app_main:深入剖析ESP32 FreeRTOS双核启动的代码级实现
1. ESP32双核启动全景图:从硬件复位到RTOS就绪 第一次拿到ESP32开发板时,你可能和我一样好奇:按下复位键后,这个小小的芯片内部究竟发生了什么?为什么我们的app_main函数能自动运行?今天我们就用"显微…...
创新实训第一周总结
第一周工作产出较少,作为患者端的开发者,为了保证数据库不出现重合或冲突等原因,我等待医生端和管理员端的开发初步完成后再进行的开发。第一篇博客的技术性会较低想到什么说什么本周的工作主要以分析为主首先分析了数据库的结构(…...
