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); // 手动ACK
    factory.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 在秒杀系统中的稳定性和吞吐能力 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】多线程和高并发编程(三):锁(下)深入ReentrantReadWriteLock

文章目录 4、深入ReentrantReadWriteLock4.1 为什么要出现读写锁4.2 读写锁的实现原理4.3 写锁分析4.3.1 写锁加锁流程概述4.3.2 写锁加锁源码分析4.3.3 写锁释放锁流程概述&释放锁源码 4.4 读锁分析4.4.1 读锁加锁流程概述4.4.1.1 基础读锁流程4.4.1.2 读锁重入流程4.4.1.…

使用redis实现 令牌桶算法 漏桶算法

流量控制算法,用于限制请求的速率。 可以应对缓存雪崩 令牌桶算法 核心思想是: 有一个固定容量的桶,里面存放着令牌(token)。每过一定时间(如 1 秒),桶中会自动增加一定数量的令牌…

金媒婚恋交友系统V10.5的CRM操作提示:“您没有权限执行此操作”解决方法

大家都知道新年2.5日新版10.5已经升级了,这次升级相对以前更新内容相当重量级!最突出的就是CRM系统的更新和UI改观吐槽的内容都改进了我愿意和大家分享代码和新得~关注我昵称就能知道我哦!! 出现原因:是这个红娘账号没…

ubuntu使用最佳流程2:ubuntu20.04安装cuda(多版本切换),cudnn,显卡驱动

cuda安装(多版本cuda安装:可切换) 查看系统硬件配置 查询Linux系统的版本号 lsb_release -a查询显卡型号 待更新下载 CUDA官方传送门 找到适合自己的命令行下载安装即可 安装 accept 第一个driver去掉(点击enter&#xff…

Crowdin 在线本地化平台调用硅基流动AI预翻译

平台介绍 硅基流动(AI服务平台) 官网:https://siliconflow.cn/zh-cn/ 官方介绍 我主要使用:云服务平台 SilliconCloud 此平台已经将热门的开源大语言模型部署,花钱买额度,就能使用 API 最近有上线 Deep…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细,感觉很强大有木有,关键还会生成流程图,对程序员理解业务非常有帮忙,基本能做到哪里不懂点哪里。…

游戏引擎学习第97天

回顾昨天并计划今天 在这期节目中,主要讲解了光照的概念,并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分: 光照的基础概述:讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论,使用的是自行搭建的AI人脸融合库,可以离线不受限制无限次生成,有需要的可以后台私信python ai换脸融合。 TODO 未来的方向:3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface,openvc…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

AutoMQ 如何实现没有写性能劣化的极致冷读效率

前言 追赶读(Catch-up Read,冷读)是消息和流系统常见和重要的场景。 削峰填谷:对于消息来说,消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住,让下游在容量范围内消费…

[AI]Mac本地部署Deepseek R1模型 — — 保姆级教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆级教程 DeepSeek R1是中国AI初创公司深度求索(DeepSeek)推出大模型DeepSeek-R1。 作为一款开源模型,R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI o1模型正式版,并采用MI…

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…

Ollama 简单 好用 好玩

简介 Ollama https://github.com/ollama/ollama/ 是一个基于 Go 语言 的 本地大语言模型运行框架,专注于本地化运行大型语言模型(LLM)的开源工具。 类 Docker 产品(支持 list,pull,push,run 等命令),更好玩…

存储可靠性:从基于磁盘的RAID到分布式纠删码(EC),多副本

文章目录 0.简介1.RAID1.1 RAID 01.2 RAID 11.3 RAID 51.4 RAID 61.5 RAID 10 2.EC(纠删码)2.1 概念2.2 原理 3.多副本4. 总结和优缺点比较 0.简介 在选择数据存储方案时,一个绕不开的话题就是数据存储的可靠性(面对故障时的应对…

【自然语言处理】利用Memory Layer替换Transformer中的FFN

论文地址:https://arxiv.org/pdf/2412.09764 相关博客 【自然语言处理】利用Memory Layer替换Transformer中的FFN 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】…

Redis持久化的两种方式:RDB和AOF

redis中的数据存储在缓存中,如果没有持久化的策略,Redis一旦宕机,那么将会导致数据丢失;因此redis提供了以下两种持久化方式:RDB和AOF 一般来说,大部分公司对这两种方式都是同时开启的 一、RDB RDB策略全…

linux查看所有程序占用的本地端口

sudo ss -tulwnp ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 查阅ss的帮助文档(man ss),发现选项…

组件库选择:ElementUI 还是 Ant Design

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流

CEF132 编译指南 MacOS 篇 - 基础开发工具安装实战 (二)

1. 引言 在 macOS 平台上编译 CEF132 之前,首要任务是搭建一个完善的开发环境。与 Windows 和 Linux 环境不同,macOS 的开发环境主要以 Xcode 为核心。本篇将作为 CEF132 编译指南系列的第二篇,详细指导读者如何在 macOS 系统上安装和配置 X…