1、持久化機制
rabbitmq的持久化分為隊列持久化、消息持久化和交換器持久化。 不管是持久化的消息還是非持久化的消息都可以被寫入到磁盤。
持久化消息會同時寫入磁盤和內存(加快讀取速度),非持久化消息會在內存不夠用時,將消息寫入磁盤(一般重啟之后就沒有了)。
(1)、隊列的持久化是在定義隊列時的durable參數來決定的,當durable為true時,才代表隊列會持久化。
Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel(); //第二個餐胡設置為true,代表隊列持久化
channel.queuDeclare("q_1",true,false,false,null);
(2)、消息持久化通過消息的deliveryMode來設置,在發送消息是通過basicPublish的參數傳入。
//通過傳入MessageProperties.PERSISTENT_PLAIN就可以實現消息持久化
channel.basicPublish("","q_1",MessageProperties.PERSISTENT_PLAIN,"persistent_test_message".getBytes());
(3)、交換器也需要在定義的時候設置持久化標志,否則在rabbitmq重啟后將丟失。
//durable為true則開啟持久化
Exchange.DeclareOk exchangeDeclare(String exchange,String type,boolean durable)throws IOException
~exchange 交換器的名稱
~ type 交換器的類型,常見的如 fanout direct topic
~ durable: 設置是否持久 durab 設置為 true 表示持久化, 反之是非持久 。持久化可以將交換器存盤,在服務器重啟 的時候不會丟失相關信息。
2、內存控制
(1)、內存告警
當內存使用超過配置的閾值或者磁盤剩余控件低於配置的閾值時,rabbitmq會暫時阻塞客戶端的連接,並停止接收從客戶端發來的消息,以避免服務崩潰,客戶端與服務端的心跳檢測也會失敗。
當出現內存告警時,可以通過管理命令臨時調整內存大小。
rabbitmqctl set_vm_memory_high_watermark <fraction> fraction為內存閾值,rabbitmq默認是0.4,表示當rabbitmq使用的內存超過總內存的40%時,就會產生告警並阻塞所有生產則連接。 通過此命令修改的閾值在rabbitmq重啟之后將會失效,通過修改配置文件的方式設置的閾值才會永久有效,但需要重啟服務才會生效。
配置文件:rabbitmq.conf
#相對值,也就是前面的fraction,建議設置在0.4~0.66之間,不要超過0.7
vm_memory_high_watermark.relative=0.4
#絕對值,單位為KB,MB,GB,對應的臨時命令是:rabbitmqctl set_vm_memory_high_watermark absolute <value>
#vm_memory_high_watermark.absolute=1GB
(2)、內存換頁
在某個broker節點觸及內存並阻塞生產者之前,他會嘗試將隊列內存中的消息換頁存儲到磁盤以釋放內存空間。持久化和非持久化的消息都會被轉儲到磁盤中,其中持久化的消息本身就在磁盤中有一個備份,所以這里會將持久化的消息從內存中清除掉。
默認情況下,在內存達到內存閾值的50%時會進行換頁操作。也就是說,在默認的內存閾值40%的情況下,當內存超過0.4*0.5=0.2時會經行換頁動作。
內存換頁可以通過在配置文件中設置來進行調整。
vm_memory_high_watermark_paging_ratio=0.75
以上配置將會在rabbitmq內存使用率達到30%(假設內存閾值時0.4)時進行換頁動作,並在40%時阻塞生產者。當vm_memory_high_watermark_paging_ratio的值大於1時,相當於禁用了換頁功能。
3、磁盤控制
(1)、磁盤告警
當磁盤剩余空間低於設置的閾值時,rabbitmq同樣會阻塞生產者,這樣可以避免因非持久化的消息持續換頁而耗盡磁盤空間導致服務崩潰。
默認情況下,磁盤的閾值是50M,表示當磁盤剩余空間低於50M時,會阻塞生產者並停止內存中消息的換頁動作。這個閾值的設置可以減小,但不能完全消除因磁盤耗盡而導致崩潰的可能性。比如在兩次磁盤空間檢測期間內,磁盤空間從大於50M被耗盡到0M。
備注:一個相對謹慎的做法是將磁盤閾值設置為與操作系統所顯示的內存大小一致。
(2)、磁盤限制
通過以下命令可以臨時調整磁盤閾值
#設置具體大小,單位為KB/MB/GB rabbitmqctl set_disk_free_limit <disk_limit> #設置相對值,建議取值為1.0~2.0(相對於內存的倍數,如內存大小是8G,若為1.0,則表示磁盤剩余8G時,阻塞) rabbitmqctl set_disk_free_limit mem_relative <fraction> 對應的配置文件配置如下: disk_free_limit.relative=2.0 #disk_free_limit_absolute=50MB