我们创建了一个包含两个节点(rabbit和rabbit1)的Rabbitmq集群。我们有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");
}
我们应该如何处理群集?
答案 0 :(得分:1)
您可以连接到您喜欢的节点。
整个群集中都可以看到交换和队列。
在节点前使用和加载均衡器是常见的做法,因此客户端必须只知道均衡器ip / dns
clients ----> balancer -----> RabbitMQ cluster
答案 1 :(得分:1)
RabbitMQ.Client
已支持连接多台主机超过一年。它已在pull request #92中修复。您应该可以执行以下操作
using (var connection = connectionFactory.CreateConnection(hostList))
using (var channel = connection.CreateModel())
{
}
但是,使用这种方法,您需要自己执行所有恢复等操作。大约一年前,我们在EasyNetQ
客户端遇到了稳定性方面的问题,但是自从我们开始使用RawRabbit
我们的集群环境以来从未真正遇到问题。
免责声明:我是RawRabbit的创建者。
答案 2 :(得分:0)
.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在集群节点之间进行负载均衡,然后负责检测节点故障并将故障节点带出集群)