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

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.