Rabbitmq -从c#连接到集群

本文关键字:连接 Rabbitmq | 更新日期: 2023-09-27 18:09:39

我们已经创建了一个有两个节点的RabbitMQ集群(rabbit和rabbit1)。我们有4个队列,通过执行http://www.rabbitmq.com/clustering.html和http://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");
}

我们应该如何处理集群?

Rabbitmq -从c#连接到集群

RabbitMQ.Client支持连接多台主机已有一年多了。在pull request #92中修复。您应该能够执行如下操作

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

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

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

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

交换和队列在整个集群中是可见的。

在节点前使用负载平衡器是常见的做法,因此客户端只需要知道平衡器的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传输)或masstransse也可能是有趣的。

另一种方法是在单个节点前面设置一个智能负载均衡器(这样myrabbitcluster.mycompany.com就可以在集群节点之间进行负载平衡,然后负责检测节点故障并将故障节点从集群中取出)。