当前位置: 首页 > article >正文

RabbitMQ的高级特性-限流

消息分发:

       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参数,设置应答方式为手动应答

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

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

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


http://www.kler.cn/news/325887.html

相关文章:

  • 英集芯IP5911:集成锂电池充电管理和检测唤醒功能的低功耗8位MCU芯片
  • axios proxy 和 httpsAgent 的使用差异案例详解
  • Vue发送邮件攻略:从搭建到实现详细步骤?
  • asp.net mvc core 路由约束,数据标记DataTokens
  • elasticsearch基础知识、go如何操作elasticsearch
  • EP41 我的评分和我的下载公用分类列表
  • C++游戏开发详解:从入门到实践
  • 解决 Sqoop 导入 Hive 时时间字段精度丢失问题
  • 字母象形:十分有趣的单词扩展逻辑
  • Linux基础(四):文件权限与目录配置
  • vulhub Jboss 漏洞攻略
  • 华为OD真题机试-英文输入法(Java)
  • MySQL9个连接:left join、inner join等
  • RabbitMQ常用管理命令及管理后台
  • 深度学习推理的技术实现与优化策略
  • 达梦数据库导入导出统计信息
  • 【tower-boot 系列】开源RocketMQ和阿里云rockerMq 4.x和5.x集成 (一)
  • C#中实现压缩包(如ZIP)的解压功能
  • 源2.0全面适配百度PaddleNLP,大模型开发开箱即用
  • 弹射型蜂群巡飞无人机技术详解
  • 光电开关应用设计讨论
  • 0x09 瑞友 应用虚拟化系统 GetBSAppUrl SQL注入漏洞 - 复现
  • 【学习笔记】手写 Tomcat 七
  • MySQL 8 临时关闭缓存
  • 安卓主板_MTK4G/5G音视频记录仪整机及方案定制
  • Python酷库之旅-第三方库Pandas(127)
  • ASPICE的商业价值:提升汽车软件开发竞争力与质量保障
  • Qt——如何创建一个项目
  • vulhub weblogic 靶场攻略
  • ElementPlus---Timeline 时间线组件使用示例