Rabbitmq - 从C#连接到集群

时间:2016-09-29 10:30:47

标签: c# .net rabbitmq

我们创建了一个包含两个节点(rabbit和rabbit1)的Rabbitmq集群。我们有4个队列,按照http://www.rabbitmq.com/clustering.htmlhttp://www.rabbitmq.com/ha.html

配置为高可用队列

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

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

我们应该如何处理群集?

3 个答案:

答案 0 :(得分:1)

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

整个群集中都可以看到交换和队列。

在节点前使用和加载均衡器是常见的做法,因此客户端必须只知道均衡器ip / dns

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

答案 1 :(得分:1)

RabbitMQ.Client已支持连接多台主机超过一年。它已在pull request #92中修复。您应该可以执行以下操作

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

}

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

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

答案 2 :(得分: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在集群节点之间进行负载均衡,然后负责检测节点故障并将故障节点带出集群)