正如标题所述,我想为RMQ .NET ConnectionFactory
提供多个URI,希望它能自动故障转移到第一个可用的URI,而不是仅限于一个URI。
设置
使用 Docker快速入门终端( Docker Toolbox 的一部分)我创建了四个容器,每个容器都在运行它的RMQ实例上运行。 我按如下方式对RMQ节点进行了聚类:
下游节点与上游节点共享Federated Queue以增加吞吐量。
使用
我在C#中编写了一个简单的控制台应用程序,它将生成消息并将消息发布到node4(主要上游RMQ实例)。
我想测试RMQ配置的冗余/自动故障转移,因为我设置了AutomaticRecoveryEnabled
(docs)和TopologyRecoveryEnabled
(docs)的标记和拥有联合队列设置。
但是,RMQ .NET库提供的ConnectionFactory
似乎不支持指定多个URI(docs)。所以我不得不手动编码处理节点关闭时的切换 - 我这样做是通过捕获节点不再可访问时抛出的异常然后ping所有节点来查看哪些节点是活动的。
有没有办法为ConnectionFactory提供多个Rabbit端点,以便它可以自动进行故障转移?
答案 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#客户端,没有。你将不得不做你正在做的事我害怕。