Rabbitmq -从c#连接到集群
本文关键字:连接 Rabbitmq | 更新日期: 2023-09-27 18:09:39
我们已经创建了一个有两个节点的RabbitMQ集群(rabbit和rabbit1)。我们有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");
}
我们应该如何处理集群?
RabbitMQ.Client
支持连接多台主机已有一年多了。在pull request #92中修复。您应该能够执行如下操作
using (var connection = connectionFactory.CreateConnection(hostList))
using (var channel = connection.CreateModel())
{
}
然而,使用这种方法,您需要自己执行所有恢复等操作。大约一年前,我们在EasyNetQ
客户端中遇到了大量的稳定性问题,但自从我们开始在集群环境中使用RawRabbit
以来,它就没有真正的问题了。
免责声明:我是RawRabbit的创建者。
您可以连接到您喜欢的节点。
交换和队列在整个集群中是可见的。
在节点前使用负载平衡器是常见的做法,因此客户端只需要知道平衡器的IP/DNS。
clients ----> balancer -----> RabbitMQ cluster
. 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传输)或masstransse也可能是有趣的。
另一种方法是在单个节点前面设置一个智能负载均衡器(这样myrabbitcluster.mycompany.com就可以在集群节点之间进行负载平衡,然后负责检测节点故障并将故障节点从集群中取出)。