如果MQ消息的生产速度远远大于消费速度,会产生大量任务堆积,导致性能下降。该如何控制流量呢?可从以服务端和消费端两个方面来考虑。
1.服务端流控
队列有两个控制长度的属性:x-max-length,x-max-length-bytes,分别表示队列中最大存储消息数和消息容量。只要有一个超了,队头的消息会被丢弃。但是这个不能真正实现限流。
另外两种方法是内存控制和磁盘控制。内存控制就是当MQ占物理内存超过40%就主动抛出内存警告并阻塞所有连接,这个可以通过配置来修改的。磁盘控制,就是磁盘剩余可用空间低于默认值50MB时触发,这个也可以设置。
2.消费端流控
在push模式下,消费端也可能因为接收太多,无法及时处理而需要对其进行控制。
这个可以基于Consumer或者Channel设置 prefetch count的值,表示Consumer端的最大unached messages数目。当超过这个数值的消息未被确认,MQ会停止投递新的消息给该消费者。