網絡異常自動恢復
更新時間 2023-06-18 17:22:12
最近更新時間: 2023-06-18 17:22:12
分享文章
由于服務端升級、服務端重啟、網絡抖動等原因,服務端和客戶端的網絡連接可能會斷開。本文介紹如何在客戶端設置Connection和Topology自動恢復,使Connection和Topology在網絡連接斷開后自動恢復,避免斷連對業務造成影響。
觸發原因
觸發Connection自動恢復的原因如下:
- Connection的I/O拋出異常。
- Socket讀取操作超時。
- 檢測到服務端心跳丟失。
恢復方法
4.0.0及以上版本Java客戶端默認開啟Connection和Topology自動恢復,無需在代碼中設置。
在客戶端開啟Connection和Topology(Queue、Exchange、Binding、Consumer)自動恢復的方法如下:
- factory.setAutomaticRecoveryEnabled(boolean):用于開啟或關閉Connection自動恢復。
- factory.setNetworkRecoveryInterval(long):用于設置重試時間間隔。如果Connection自動恢復異常,設置了Connection自動恢復的客戶端將在一段固定時間間隔(默認為5秒)后重試。
- factory.setTopologyRecoveryEnabled(boolean):用于開啟Topology自動恢復。Topology包括Queue、Exchange、Binding、Consumer。
示例代碼
開啟Connection和Topology自動恢復的客戶端示例代碼如下:
ConnectionFactory?factory?=newConnectionFactory();
//?設置接入點,在分布式消息服務RabbitMQ控制臺實例詳情頁面獲取。
factory.setHost("192.168.x.x");
//?設置Vhost名稱
factory.setVirtualHost("/");
//?端口
factory.setPort(5672);
//?基于網絡環境設置合理的超時時間。
factory.setConnectionTimeout(30*1000);
factory.setHandshakeTimeout(30*1000);
factory.setShutdownTimeout(0);
//?開啟Connection自動恢復。
factory.setAutomaticRecoveryEnabled(true);
//?設置Connection重試時間間隔為10秒。
factory.setNetworkRecoveryInterval(10000);
//?開啟Topology自動恢復。
factory.setTopologyRecoveryEnabled(true);
Connection?connection?=?factory.newConnection();
恢復限制
Connection自動恢復的限制如下:
- Connection斷開需要一定的時間檢測。要確保這段時間內發送的消息不丟失,需使用Publisher Confirms實現可靠發送。
- Channel異常導致Connection斷開時,不會觸發Connection自動恢復。Channel異常通常為應用級別的問題,需要使用方自行處理。
- Connection自動恢復不會使Channel也自動恢復。