簡體   English   中英

RabbitMQ C# 客戶端從具有仲裁隊列的集群上的節點故障中恢復

[英]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 種方法可以使故障轉移過程更加健壯:

  • 將RabbitMQ集群節點的多個主機名或ip地址傳遞給RabbitMQ客戶端
  • 將 RabbitMQ 節點置於 4 級負載均衡器之后,並將 RabbitMQ 客戶端配置為連接到負載均衡器,而不是直接連接到集群節點
  • 禁用 DNS 緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM