Rabbitmq 流控
生產者流控
當觸發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
=INFO REPORT==== 23-Jul-2015::10:16:14 ===
vm_memory_high_watermark set. Memory used:128453216 allowed:120566292
經測試,發現一旦超過了記憶體使用上線,就會觸發流控機制,觸發流控的原因是因為消費者處理訊息的能力,跟不上訊息傳送這產生的能力,最後時間長了,會導致記憶體
超過了規定使用的記憶體,這樣會觸發訊息產生端的流控機制,控制訊息傳送的速度,來
減輕MQ和消費者端的壓力。
解決方式:
根據Routingkey進行訊息的切割,繫結不同的queue進行消費 增加消費者端的消費能力,或者增加消費者(根本解決) 控制訊息產生者端的傳送速率(不太現實) 增加mq的記憶體(治標不治本)