一,什么是限流?为什么要限流?
rabbitMQ的限流,就是指在消费者端,限制消费者接收消息的数量。
之所以要限制消费者的流量,是因为,假设Rabbitmq 服务器积压了很多很多条消息,当我们打开一个消费者,巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么多消息。类似于许多请求都到达数据库一样,会给我们的系统造成很大的压力,影响系统的性能,严重甚至会导致系统崩溃。
那为什么要在消费者端限流呢,不在生产者端限流?因为,生产者消息的产生,是用户的行为,我们无法去约束它。例如,下单的时候,会产生一条确认下单是否超时的消息,每产生一条消息,都是用户进行了一个下单的操作。
二,基础知识及实现方法介绍
主要用Channel类的basicQos方法来实现限流的效果,方法介绍如下:
channel.basicQos()
channel.basicQos(int prefetchSize,int prefetchCount,boolean global)
参数:
prefetchSize:消息的大小
prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack
global:是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别
注意,prefetchSize和golobal参数还没有实现。
Cha