【RabbitMQ】SpringBoot整合RabbitMQ实现消费端限流

目录

一、限流

二、配置信息

三、代码实现


一、限流

限流就是限制系统的输入输出流量以此来达到保护系统的目的,而RabbitMQ消费端限流指的是对RabbitMQ每次给消费者的消息数量做一定的限制,那么为什么我们要对消费端进行限流呢,举个例子比如我们的系统因为维护升级而下线处理,在处理升级的这个过程中生产者是一直投递消息的。这就会导致MQ服务器消息堆积,如果我们不限流消费者系统升级上线后就会面对巨量的消息,此时就有可能导致系统宕机

二、配置信息

我们实现消费端限流时需要开启RabbitMQ的手动签收,在之前的文章里有提到【RabbitMQ】图解RabbitMQ是如何保证消息可靠性的_1373i的博客-CSDN博客icon-default.png?t=N2N8https://blog.csdn.net/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);
    }
}

 【RabbitMQ】SpringBoot整合RabbitMQ实现消费端限流_第1张图片

消费了10条语句,此时我们就实现了RabbitMQ消费端的限流 

你可能感兴趣的:(RabbitMQ,Java,java-rabbitmq,rabbitmq,spring,boot)