2016-09-29 82 views
0

我們創建了一個包含兩個節點(rabbit和rabbit1)的Rabbitmq集羣。我們有4個隊列,這是使用下面的代碼片段Rabbitmq - 從C#連接到集羣

var factory = new ConnectionFactory(){ HostName = _rabbitMQ_Hostname, UserName = _rabbitMQ_Username, Password = _rabbitMQ_Password}; 

using (var connection = factory.CreateConnection()) 
using (var channel = connection.CreateModel()) 
{ 
    channel.QueueDeclare(queue: _autoCancellationPNS_QueueName, 
    durable: true, 
    exclusive: false, 
    autoDelete: false, 
    arguments: null); 

    string message = appointmentId.ToString(); 
    var body = Encoding.UTF8.GetBytes(message); 
    IBasicProperties properties = channel.CreateBasicProperties(); 
    properties.DeliveryMode = 2; 
    channel.BasicPublish(exchange: _rabbitMQ_Exchange, 
     routingKey: _autoCancellationPNS_RoutingKey, 
     basicProperties: properties, 
     body: body); 
    returnMessage.ShortMessage = "Added to queue"; 
    returnMessage.LongMessage = "Added to queue"; 
    logger.Debug("|Added to queue"); 
} 

,我們應該如何處理集羣以下http://www.rabbitmq.com/clustering.htmlhttp://www.rabbitmq.com/ha.html

我們用來連接到節點羣集之前配置高度可用的隊列?

回答

0

您可以連接到您喜歡的節點。

交換和隊列在集羣中可見。

使用,並在節點前的負載均衡是常見的做法,所以客戶必須知道只有平衡器IP/DNS

clients ----> balancer -----> RabbitMQ cluster 
0

.NET客戶端不(據我所知)不提供任何支持這一點。您自己構建一些內容以選擇並連接到羣集上的某個節點。

例如,如果你想實現一個循環策略,僞代碼將是這樣的

Get list of hostname/port combinations that form the cluster 
do { 
    try { 
     connect to next hostname in the list 
    } catch (rabbit connection failed) { 
     maybe log a warning 
    } 
} while not connected 

當然,你現在需要考慮的連接策略,重試連接嘗試數目,指數退避,...

...這就是爲什麼我強烈建議尋找一個已經提供這種功能(以及更多)的庫。一個這樣的庫是EasyNetQ(在nuget上可用),也許NServiceBus(帶有RabbitMq Transport)或MassTransit也可能很有趣。

另一種方法是在各個節點前設置智能負載均衡器(因此,myrabbitcluster.mycompany.com會在羣集節點之間進行負載均衡,然後負責檢測節點故障並將錯誤節點帶出羣集)。

1

RabbitMQ.Client已支持連接多個主機超過一年。它被修復在pull request #92。你應該可以做下面的事情

using (var connection = connectionFactory.CreateConnection(hostList)) 
using (var channel = connection.CreateModel()) 
{ 

} 

但是,使用這種方法你需要執行所有的恢復等。大約一年前,我們在EasyNetQ客戶端遇到了穩定性問題,但由於我們開始使用RawRabbit我們的集羣環境,並且從未真正遇到過問題。