C# Rabbitmq-从C连接到群集#

C# Rabbitmq-从C连接到群集#,c#,.net,rabbitmq,C#,.net,Rabbitmq,我们已经创建了一个具有两个节点(rabbit和rabbit1)的RabbitMQ集群。我们有4个队列,通过以下和配置为高可用队列 在集群之前,我们使用下面的代码片段连接到节点 var factory = new ConnectionFactory(){ HostName = _rabbitMQ_Hostname, UserName = _rabbitMQ_Username, Password = _rabbitMQ_Password}; using (var conne

我们已经创建了一个具有两个节点(rabbit和rabbit1)的RabbitMQ集群。我们有4个队列,通过以下和配置为高可用队列

在集群之前,我们使用下面的代码片段连接到节点

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");
}

我们应该如何处理集群?

您可以连接到您喜欢的节点

交换和队列在集群中可见

在节点前面使用负载平衡器是常见的做法,因此客户端必须只知道平衡器IP/DNS

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

                   
据我所知,.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传输)或MassTransit也很有趣


另一种方法是在各个节点前面设置智能负载平衡器(因此myrabbitcluster.mycompany.com在集群节点之间进行负载平衡,然后负责检测节点故障并将故障节点移出集群).

RabbitMQ.Client支持连接到多个主机已有一年多了。它是固定的。您应该能够执行以下操作

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

}
但是,使用这种方法,您需要自己执行所有恢复等操作。大约一年前,我们在
EasyNetQ
客户端的稳定性方面遇到了巨大的问题,但自从我们开始使用集群环境以来,从来没有真正遇到过问题


免责声明:我是RawRabbit的创建者。

请披露您是否制作了您建议的库。