目录
一、限流
限流就是限制系统的输入输出流量以此来达到保护系统的目的,而RabbitMQ消费端限流指的是对RabbitMQ每次给消费者的消息数量做一定的限制,那么为什么我们要对消费端进行限流呢,举个例子比如我们的系统因为维护升级而下线处理,在处理升级的这个过程中生产者是一直投递消息的。这就会导致MQ服务器消息堆积,如果我们不限流消费者系统升级上线后就会面对巨量的消息,此时就有可能导致系统宕机
二、配置信息
我们实现消费端限流时需要开启RabbitMQ的手动签收,在之前的文章里有提到【RabbitMQ】图解RabbitMQ是如何保证消息可靠性的_1373i的博客-优快云博客https://blog.youkuaiyun.com/qq_61903414/article/details/130178023?spm=1001.2014.3001.5501
我们需要在配置文件里加入一些配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /learn
publisher-confirm-type: correlated #开启确认机制
publisher-returns: true #开启回退模式
listener:
simple:
acknowledge-mode: manual #开启手动签收
prefetch: 10 #消费端每次拉去10条数据,直到确认消费完毕才拉去下10条
通过开启手动签收与配置限流量prefetch来实现消费端限流
三、代码实现
此时我们的队列里有38条消息
我们编写消费者代码,在签收时先不签收,查看会消费几条数据
package com.example.demo.controller;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class DemoQueueListener {
@RabbitListener(queues = "dQueue1")
public void Listener1(Message message,Channel channel) throws IOException {
System.out.println("消费消息" + message.getBody());
//channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
}
}
消费了10条语句,此时我们就实现了RabbitMQ消费端的限流