RabbitMQ的高级特性-限流

embedded/2024/10/4 19:32:27/

消息分发:

       RabbitMQ队列拥有多个消费者时, 队列会把收到的消息分派给不同的消费者. 每条消息只会发送给订阅列表⾥的⼀个消费者. 这种⽅式⾮常适合扩展, 如果现在负载加重,那么只需要创建更多的消费者来消费处理消息即可.


       默认情况下, RabbitMQ是以轮询的⽅法进⾏分发的, ⽽不管消费者是否已经消费并已经确认了消息. 这种⽅式是不太合理的, 试想⼀下, 如果某些消费者消费速度慢, ⽽某些消费者消费速度快, 就可能会导致某些消费者消息积压, 某些消费者空闲, 进⽽应⽤整体的吞吐量下降,可以这样解决:

答:使用channel.basicQos(int prefetchCount) ⽅法, 来限制当前信道上的消费者所能保持的最⼤未确认消息的数量⽐如: 消费端调⽤了 channelbasicQos(5) , RabbitMQ会为该消费者计数, 发送⼀条消息计数+1, 消费⼀条消息计数-1, 当达到了设定的上限, RabbitMQ就不会再向它发送消息了,直到消费者确认了某条消息.类似TCP/IP中的"滑动窗⼝".
注:prefetchCount 设置为0时表⽰没有上限.
       basicQos 对拉模式的消费⽆效

应⽤场景
消息分发的常⻅应⽤场景有如下:

1. 限流
2. ⾮公平分发

1、限流
如下使⽤场景:
       订单系统每秒最多处理5000请求, 正常情况下, 订单系统可以正常满⾜需求;但是在秒杀时间点, 请求瞬间增多, 每秒1万个请求, 如果这些请求全部通过MQ发送到订单系统, ⽆疑会把订单系统压垮

RabbitMQ提供了限流机制, 可以控制消费端⼀次只拉取N个请求
通过设置prefetchCount参数, 同时也必须要设置消息应答⽅式为⼿动应答
prefetchCount: 控制消费者从队列中预取(prefetch)消息的数量, 以此来实现流控制和负载均衡

配置prefetch参数,设置应答方式为手动应答

java">listener:simple:acknowledge-mode: manual #⼿动确认prefetch: 5

负载均衡
我们也可以⽤此配置,来实现"负载均衡"
如下图所⽰, 在有两个消费者的情况下,⼀个消费者处理任务⾮常快, 另⼀个⾮常慢,就会造成⼀个消费者会⼀直很忙, ⽽另⼀个消费者很闲. 这是因为 RabbitMQ 只是在消息进⼊队列时分派消息. 它不考虑消费者未确认消息的数量.

java">listener:simple:acknowledge-mode: manual #⼿动确认prefetch: 1


http://www.ppmy.cn/embedded/121287.html

相关文章

GPT理论

1.GPT发展 Transformer是一个用作翻译任务的模型,谷歌出品。 GPT全称 lmproving Language Understanding by Generative Pre-Training,用预训练语言理解模型。OPENAI出品。 BERT全称Pre-training of Deep BidirectionalTransformers for Language Unde…

CSS多列

CSS多列 前言 有的时候希望文本能按照多列效果显示,如: 这时候就要把文本显示效果改成多列显示,标题独占一行 CSS文本多列使用 ① column-count 指定文本分为几列,如: column-count: 3;② column-gap 指定列之…

如何实现一个Mini Spring Boot

Spring Boot 是一个强大的框架,简化了 Spring 应用程序的开发。但是,它的核心思想和实现其实并不复杂。接下来,我们将从零开始,逐步实现一个简化版的 “Mini Spring Boot”。 1. 核心思想 Spring Boot 的核心功能包括&#xff…

学习docker第二弹------基本命令[帮助启动类命令、镜像命令、容器命令]

docker目录 前言基本命令帮助启动类命令停止docker服务查看docker状态启动docker重启docker开机启动docker查看概要信息查看总体帮助文档查看命令帮助文档 镜像命令查看所有的镜像 -a查看镜像ID -q在仓库里面查找redis拉取镜像查看容器/镜像/数据卷所占内存删除一个镜像删除多个…

【算法篇】回溯算法类(1)(笔记)

目录 一、理论基础 1. 相关题目 2. 遍历过程 3. 代码框架 二、LeetCode 题目 1. 组合 2. 组合总和III 3. 电话号码的字母组合 4. 组合总和 5. 组合总和II 6. 分割回文串 7. 复原IP地址 8. 子集 一、理论基础 1. 相关题目 2. 遍历过程 3. 代码框架 void backtr…

C++ 游戏开发

C游戏开发 C 是一种高效、灵活且功能强大的编程语言,因其性能和控制能力而在游戏开发中被广泛应用。许多著名的游戏引擎,如 Unreal Engine、CryEngine 和 Godot 等,都依赖于 C 进行核心开发。本文将详细介绍 C 在游戏开发中的应用&#xff0…

Python练习1

1. 用三种以上方法实现字符串拼接。 # 方法一:直接用拼接 s1"Hello" s2"World1" ss1" "s2 print(s)# 方法二:格式化输出 res1 "Hello" res2 "World3" res f"{res1} {res2}" print(res)…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑,提供一百余款基于“端云大数据”产品/服务,提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞,由于某些接口没有鉴权&#xff0c…