內存:
1.當內存使用超過配置的閾值或者磁盤剩餘空間低於配置的閾值時,RabbitMq都會暫時阻塞(block)客戶端的連接(Connection)並停止接收從客戶端發來的消息,以此避免服務崩潰。與此同時,客戶端與服務端的心跳檢測也會失效。
2.被阻塞的Connection狀態要麼是blocking,要麼是blocked。前者對應並不試圖發消息的Connection,比如消費者關聯的Connection,這種狀態下的Connection可以繼續運行。而後者對應於一直有發送消息的Connection,這種狀態下的Connection會被停止發送消息。注意在一個集羣中,如果一個Broker節點的內存或者磁盤受限,都會引起整個集羣中所有的Connection被阻塞.
3.理想的情況是當發生阻塞時可以在組織生產者的同時而又不影響消費者的運行。客戶端程序可以通過添加BlockedListener來監聽相應連接的阻塞信息.
4.服務器在啓動時會計算系統內存的大小。默認vm_memory_high_watermark的值爲0.4(大於等於0的浮點數,建議在0.4~0.66之間,不建議超過0.7),即內存閾值爲40%,表示RabbitMQ使用 的內存超過40%時,就會產生內存警告並阻塞所有生產者的連接。一旦警告被解除,一切都會恢復正常.
5.默認將EabbitMQ所使用內存的閾值設置爲40%,這並不意味着此時RabbitMQ不能使用超過40%的內存,這僅僅只是限制了RabbitMQ的消息生產者。在最壞的情況下,Erlang的垃圾回收機制會導致兩倍的內存消耗,即80%的使用佔比(rabbitmqctl set_vm_memory_high_watermark 0.3)
6.通過rabbitmqctl set_vm_memory_high_watermark命令設置的閾值在服務器重啓後都會失效,通過配置文件的方式設置的則不會失效,但是修改後你的配置需要重啓
7.注意:遇到無法識別的操作系統,需要手動提升值
磁盤警告:
1.當剩餘磁盤空間低於確定的閾值時,RabbitMQ同樣會阻塞生產者,這樣可以避免因非持久化的消息持續換頁而耗盡磁盤空間導致服務器崩潰.
2.磁盤默認閾值爲50MB,可以通過在配置文件配置disk_free_limit項來設置磁盤閾值(命令配置重啓時同樣會失效).
3.相對謹慎的做法是將磁盤閾值設置爲與操作系統所顯示的內存大小一致.