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

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2