生产者流控
当触发Rabbitmq的流控后,会限制生产者发送消息的频率,比如之前是2W/s限制后可能在一段时间内无法发送消息.
触发流控条件,达到内存这只的水位线(vm_memory_high_watermark )或者磁盘达到限制剩余量.一般在产生的原因是长期的生产者发送速率大于消费者消费速率导致.
流控实验
设置rabbitmqctl set_vm_memory_high_watermark 0.03让测试容易出效果默认是使用内存的40%。
* Publishers will be blocked until this alarm clears *
=INFO REPORT==== 23-Jul-2015::10:16:13 ===
vm_memory_high_watermark clear. Memory used:116782008 allowed:120566292
=WARNING REPORT==== 23-Jul-2015::10:16:13 ===
memory resource limit alarm cleared on node ansible@ansible
=INFO REPORT==== 23-Jul-2015::10:16:14 ===
vm_memory_high_watermark set. Memory used:128453216 allowed:120566292
经测试,发现一旦超过了内存使用上线,就会触发流控机制,触发流控的原因是因为消费者处理消息的能力,跟不上消息发送这产生的能力,最后时间长了,会导致内存
超过了规定使用的内存,这样会触发消息产生端的流控机制,控制消息发送的速度,来
减轻MQ和消费者端的压力。
解决方式:
根据Routingkey进行消息的切割,绑定不同的queue进行消费
增加消费者端的消费能力,或者增加消费者(根本解决)
控制消息产生者端的发送速率(不太现实)
增加mq的内存(治标不治本)