RabbitMQ高级特性——消费端限流,prefetch的设置

2024-01-01 09:59

本文主要是介绍RabbitMQ高级特性——消费端限流,prefetch的设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大伙可以到我的RabbitMQ专栏获取更多信息

demo示例这里拿

概述

在之前介绍的MQ的文章中——什么是MQ:消息队列的基本概念和优劣势,我提到了MQ对于处理高并发场景的能力,即削峰填谷

  1. 当请求并发增高的时候,所有业务请求首先放入MQ
  2. 业务系统则在保证系统正常平稳的情况下,尽力从MQ获取业务信息,按照自己的“节奏”处理业务
  3. 过多的业务积压在MQ中,拉长了整体业务的执行时长,这就是填谷

 上述过程中,第二步其实就是对消费端的限流,帮助MQ的各个消费者平稳的度过业务请求的高峰,其实还有一个场景就是当消费端因为某些情况下停止服务了一段时间,或者是宕机,或者是系统升级,在这个停止服务的过程中,在MQ中挤压了大量等待消费者消化的message,一旦消费者重启启动后提供业务服务,这时候如果不对消费端限流的话,队列中的message将一并倾泻给消费端,这很可能瞬间压垮消费端服务。所以在高并发系统的设计中,服务限流是一种很好的办法,并且是非常的必要的。

代码示例

消费者端配置:

主要注意prefetch参数,代表消费端限流数量,每个消费者未确认的未处理消息的最大数量。

server:port: 2002spring:rabbitmq:host: 127.0.0.1port: 5672username: LeoLeepassword: lyl512240816virtual-host: /LeoLeelistener:simple:acknowledge-mode: manual #消费者端确认模式:none自动确认 manual手动确认 auto通过抛出异常的类型,来做响应的处理concurrency: 1 #当前监听的数量max-concurrency: 5 #最大监听数量retry:enabled: true #是否支持重试max-attempts: 4 #最大重试次数,默认为3prefetch: 2 #消费端限流5 每个消费者未确认的未处理消息的最大数量direct:acknowledge-mode: manual    #acknowledgeMode设置为手动模式

接收消息监听器:

需要注意的是,代码中我故意屏蔽了手动确认的方法,导致消费者端在接收到消息后始终无法确认,这样就会阻塞消费者端继续从MQ获取消息,达到验证限流的目的

package com.leolee.rabbitmq.MsgListener;import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName QosListener* @Description: 消费者限流 QOS:服务质量(Quality of Service)* 1.确保ack机制为手动确认:acknowledge-mode: manual* 2.设置消费限流配置:prefetch: 2 代表消费端每次从MQ拉去两条消息处理,知道手动的确认完毕后,才继续从MQ拉去消息* @Author LeoLee* @Date 2020/11/8* @Version V1.0**/
@Component
public class QosListener implements ChannelAwareMessageListener {@RabbitListener(queues = "boot_queue")@Overridepublic void onMessage(Message message, Channel channel) throws Exception {System.out.println("-----------------------------------------");System.out.println("msg:" + new String(message.getBody()));System.out.println("处理业务逻辑用时需要3秒中,当前时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));Thread.sleep(3000);//        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);}
}

消息生产者:

连续发送10条消息

    /** 功能描述: <br>* 〈测试客户端限流,多发几条给客户端〉* @Param: []* @Return: void* @Author: LeoLee* @Date: 2020/11/8 3:06*/@Testpublic void testQos() {for (int i = 1; i <= 10; i++) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "boot.test", "test msg send:[" + i + "]");}}

执行结果:

可以清楚的看到,消费者由于配置了prefetch: 2并且接收代码中没有消息确认,剩下队列中的8条消息,始终无法被获取到,达到了限流的目的。

 

 

这篇关于RabbitMQ高级特性——消费端限流,prefetch的设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558906

相关文章

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现