正如标题所述,我想为 RMQ .NET ConnectionFactory
提供多个 URI,希望它能自动故障转移到第一个可用的 URI,而不是仅限于单个 URI .
设置
使用 Docker Quickstart Terminal(Docker 工具箱的一部分)我创建了四个容器,每个容器都在 RMQ 实例上运行. 我按如下方式对 RMQ 节点进行了集群:
- 下游(node1 和 node2)
- 上游(node3 和 node4)
下游 节点共享一个 Federated Queue与上游节点一起增加吞吐量。
使用
我用 C# 编写了一个简单的控制台应用程序,它将生成消息并将其发布到 node4(主要的上游 RMQ 实例)。
我想测试我的 RMQ 配置的冗余/自动故障转移,因为我已经为 AutomaticRecoveryEnabled
( docs ) 和 TopologyRecoveryEnabled
( docs 设置了标志) 并设置联合队列。
但是,RMQ .NET 库提供的 ConnectionFactory
似乎不支持指定多个 URI (docs)。因此,我不得不手动编写代码来处理当节点出现故障时节点之间的切换 - 我通过捕获当节点不再可访问时抛出的异常然后对所有节点执行 ping 操作以查看哪个节点处于事件状态来执行此操作。
有没有办法为 ConnectionFactory 提供多个 Rabbit 端点,以便它可以自动进行故障转移?
最佳答案
如果你看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})
如果您需要不同集群(不同的虚拟主机、用户名、密码...)之间的连接列表,那么答案是否定的,您不能使用关键客户端来做到这一点。如果仅更改主机名,我可能会工作。
关于c# - 是否可以在 RMQ .NET 中指定多个连接点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36683201/