是否可以在RMQ .NET中指定多个连接点?

时间:2016-04-17 23:07:45

标签: c# rabbitmq

正如标题所述,我想为RMQ .NET ConnectionFactory提供多个URI,希望它能自动故障转移到第一个可用的URI,而不是仅限于一个URI。

设置

使用 Docker快速入门终端 Docker Toolbox 的一部分)我创建了四个容器,每个容器都在运行它的RMQ实例上运行。 我按如下方式对RMQ节点进行了聚类:

  • 下游(node1和node2)
  • 上游(node3和node4)

下游节点与上游节点共享Federated Queue以增加吞吐量。

使用

我在C#中编写了一个简单的控制台应用程序,它将生成消息并将消息发布到node4(主要上游RMQ实例)。

我想测试RMQ配置的冗余/自动故障转移,因为我设置了AutomaticRecoveryEnableddocs)和TopologyRecoveryEnableddocs)的标记和拥有联合队列设置。

但是,RMQ .NET库提供的ConnectionFactory似乎不支持指定多个URI(docs)。所以我不得不手动编码处理节点关闭时的切换 - 我这样做是通过捕获节点不再可访问时抛出的异常然后ping所有节点来查看哪些节点是活动的。

有没有办法为ConnectionFactory提供多个Rabbit端点,以便它可以自动进行故障转移?

2 个答案:

答案 0 :(得分:3)

如果您查看ConnectionFactory,则可以使用list of hosts

创建连接
    /// <summary>
    /// Create a connection using a list of hostnames. The first reachable
    /// hostname will be used initially. Subsequent hostname picks are determined
    /// by the <see cref="IHostnameSelector" /> configured.
    /// </summary>
    /// <param name="hostnames">
    /// List of hostnames to use for the initial
    /// connection and recovery.
    /// </param>
    /// <returns>Open connection</returns>
    /// <exception cref="BrokerUnreachableException">
    /// When no hostname was reachable.
    /// </exception>
    public IConnection CreateConnection(IList<string> hostnames)
    {
        return CreateConnection(hostnames, null);
    }

顺便提一下下面的代码:

ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection conn = factory.CreateConnection();

将使用单个元素列表

调用CreateConnection({UriHostname})

如果你需要不同群集之间的连接列表(不同的vhost,用户名,密码......),那么答案是否定的,你不能用关键客户端做到这一点。如果只有主机名改变,我可能会工作。

答案 1 :(得分:1)

使用由pivotal提供的C#客户端,没有。你将不得不做你正在做的事我害怕。