[英]RabbitMQ C# Client recovering from node failure on cluster with quorum queues
我已經設置了一個帶有仲裁持久隊列的三節點 RabbitMQ 集群。
我試圖找出如何實現一種健壯的方法,以在節點發生故障時保持在生產者和消費者端(兩個 .NET Core 進程)上運行。
我在ConnectionFactory
類上使用以下選項:
var factory = new ConnectionFactory
{
HostName = hostname,
AutomaticRecoveryEnabled = true,
TopologyRecoveryEnabled = true,
VirtualHost = vhost
};
然而,從生產者和消費者測試過程(其中試圖淹沒隊列),每當我停止集群的主節點后,客戶從來沒有從這種情況中恢復,並且OperationInterruptedException
是在每次調用拋出BasicPublish
(上生產者)或BasicAck
(在消費者上)。
客戶端使用從三個節點中選擇的隨機 ip 連接到集群(由循環 dns 解析給出)。
我在某處讀到過,對於持久的經典非鏡像隊列,這是預期的行為,但是仲裁隊列呢? 它們不應該是鏡像隊列的更有效版本(盡管有一些限制)?
有沒有辦法從單個節點故障中恢復,而無需在我的客戶端中實現所有重新連接邏輯?
從我在ConnectionFactory
類中看到的,您可以在創建連接時指定主機名列表(而不是在聲明工廠的步驟中)。 你試過這個嗎?
// Summary:
// Create a connection using a list of hostnames using the configured port. By default
// each hostname is tried in a random order until a successful connection is found
// or the list is exhausted using the DefaultEndpointResolver. The selection behaviour
// can be overriden by configuring the EndpointResolverFactory.
//
// Parameters:
// hostnames:
// List of hostnames to use for the initial connection and recovery.
//
// Returns:
// Open connection
//
// Exceptions:
// T:RabbitMQ.Client.Exceptions.BrokerUnreachableException:
// When no hostname was reachable.
public IConnection CreateConnection(IList<string> hostnames);
客戶端使用從三個節點中選擇的隨機 ip 連接到集群(由循環 dns 解析給出)。
該問題很可能是由 DNS 緩存引起的。 例如,生產者/消費者 DNS 將主機名解析為單個 IP 地址,然后將其緩存(.NET 中有一個 DNS 緩存),導致 RabbitMQ 客戶端始終連接到同一個 RabbitMQ 節點(可能會被關閉)。 至少有 3 種方法可以使故障轉移過程更加健壯:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.