【问题标题】:Rabbitmq - Connecting to cluster from C#Rabbitmq - 从 C# 连接到集群
【发布时间】:2016-09-29 10:30:47
【问题描述】:

我们创建了一个带有两个节点(rabbit 和 rabbit1)的 RabbitMQ 集群。我们有 4 个队列,按照 http://www.rabbitmq.com/clustering.htmlhttp://www.rabbitmq.com/ha.html 配置为高可用队列

在集群之前,我们使用下面的sn-p连接到节点。

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

我们应该如何处理集群?

【问题讨论】:

    标签: c# .net rabbitmq


    【解决方案1】:

    一年多来,RabbitMQ.Client 一直支持连接到多个主机。它已在pull request #92 中修复。您应该能够执行以下操作

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

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

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

    【讨论】:

    • 如果您创建了您建议的库,请披露。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      .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 在集群节点之间进行负载均衡,然后应该负责检测节点故障并将故障节点从集群中移除) .

      【讨论】:

        猜你喜欢
        • 2019-07-05
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 2013-02-23
        • 2023-04-04
        • 2019-06-10
        • 1970-01-01
        相关资源
        最近更新 更多