持久化机制
RabbitMQ的持久化分为消息持久化、队列持久化、交换器持久化。无论是持久化消息还是非持久化消息都可以被写入磁盘。
当RabbitMQ收到消息时,如果是持久化消息,则会储存在内存中,同时也会写入磁盘;如果是非持久化消息,则只会存在内存中。当内存使用达到RabbitMQ的临界值时,内存中的数据会被交换到磁盘,持久化消息由于本就存在于磁盘中,不会被重复写入。
消息的持久化是在发消息时,通过deliveryMode设置,队列、交换器也可以通过参数持久化,非持久化的消息、队列、交换器在rabbitmq-server重启后会消失,即使已经被写入磁盘。
内存告警
RabbitMQ中通过内存阈值参数控制内存的使用量,当内存使用超过配置的阈值时,RabbitMQ会阻塞客户端的连接并停止接收从客户端发来的消息,以免服务崩溃,同时客户端于与服务端的心跳检测也会失效。
内存控制
当出现内存告警时,可以通过管理命令临时调整。
rabbitmqctl set_vm_memory_high_watermark <fraction>
fraction为内存阈值,默认是0.4,表示RabbitMQ使用的内存超过系统内存的40%时,会产生内存告警,通过此命令修改的阈值在重启后会失效。可以通过修改配置文件的方式,使之永久生效,但是需要重启服务。
# rabbitmq.conf
vm_memory_high_watermark.relative=0.4
#vm_memory_high_watermark.absolute=1GB