内存:
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.相对谨慎的做法是将磁盘阈值设置为与操作系统所显示的内存大小一致.