心跳檢測
更新時間 2024-01-17 18:02:40
最近更新時間: 2024-01-17 18:02:40
分享文章
本章節主要介紹分布式消息服務RabbitMQ的心跳檢測特性。
RabbitMQ實例提供了心跳功能,以確保應用程序層及時發現中斷的連接和完全無響應的對端。心跳還可以防止某些網絡設備在一段時間內由于沒有活動而中斷TCP連接。
心跳超時時間
心跳超時時間定義了對等TCP連接在多長時間后被服務端和客戶端視為關閉。
在RabbitMQ服務端和客戶端分別設置心跳超時時間,服務端和客戶端會對配置的心跳超時時間進行協商,客戶端必須配置該值來發送心跳。RabbitMQ官方團隊維護的3個客戶端(Java、.NET、Erlang語言)的心跳超時時間協商邏輯如下:
- 服務端和客戶端設置的心跳超時時間都不為0時,兩者間較小的值生效。
- 服務端和客戶端任意一端設置的心跳超時時間為0,另一端不為0時,非0的值生效。
- 服務端和客戶端的心跳超時時間都設置為0時,表示禁用心跳。
更多關于心跳檢測的說明,請參考。
心跳幀
心跳幀發送時間間隔為心跳超時時間/2,該值有時也被稱為心跳間隔。客戶端在兩次錯過心跳后,會被認為是不可達的。不同的客戶端會以不同的方式顯示這一點,但TCP連接將被關閉。當客戶端檢測到服務端由于心跳而無法訪問時,需要重新連接。
任何流量(如協議操作、消息發布、消息確認、心跳幀等)都會被認為是有效的心跳。如果連接上有其他流量,客戶端可以選擇發送心跳幀,也可以選擇不發送。如果連接上沒有其他流量,客戶端必須發送心跳幀。
在客戶端設置心跳超時時間
如果心跳超時時間設置過低,在短暫的網絡擁塞或短暫的服務器流量控制等情況下可能會產生誤報。對于大多數環境,超時時間設置為5-20秒最佳。
- 使用Java客戶端啟動心跳。
在創建連接前使用ConnectionFactory#setRequestedHeartbeat進行設置,示例如下:
ConnectionFactory cf = new ConnectionFactory(); ?
// 將心跳超時時間設置為15秒
cf.setRequestedHeartbeat(15);
- 使用.NET客戶端啟用心跳。
var cf = new ConnectionFactory();
// 將心跳超時時間設置為15秒
cf.RequestedHeartbeat = TimeSpan.FromSeconds(15);