我已经使用RabbitMQ托管了两个Docker容器(请参阅下面的Docker文件)。我使用rabbitmqctl join_cluster
将两个RabbitMQ实例组合到一个集群中。两个RabbitMQ实例的集群名称为rabbit@rabbit
。
如果我使用rabbitmq://localhost:5673/
作为连接URL,我可以与群集的单个实例进行通信。但是,如果我使用rabbitmq://rabbit@rabbit/
,则MassTransit无法连接。
如何为MassTransit组成一个连接字符串,它可以与RabbitMQ集群通信(具有故障转移管理)?
public static IBusControl ConfigureBus(string rabbitMqUri, string userName, string password)
{
return Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri(rabbitMqUri), hst =>
{
hst.Username(userName);
hst.Password(password);
});
});
}
Docker文件
version: '2'
services:
rabbit:
image: rabbitmq:management
hostname: rabbit
ports:
- "5673:5672"
- "15678:15672"
environment:
- RABBITMQ_ERLANG_COOKIE='mysecret'
hamster:
image: rabbitmq:management
hostname: hamster
ports:
- "5674:5672"
- "15679:15672"
environment:
- RABBITMQ_ERLANG_COOKIE='mysecret'
答案 0 :(得分:0)
群集名称没有说明物理连接参数。 rabbitmq://rabbit@rabbit/
只在现有的RabbitMQ上下文中有意义,但绝不会解释客户端在哪里找到你的节点。
在MassTransit中,您需要指定其他主机配置才能使用RabbitMQ群集:
public static IBusControl ConfigureBus(string[] clusterNodes,
string userName, string password) =>
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri(rabbitMqUri), h =>
{
h.Username(userName);
h.Password(password);
h.UseCluster(cluster =>
{
foreach (var node in clusterNodes)
cluster.Node(node);
});
});
});
其中clusterNodes
是群集中物理节点的主机名或IP地址列表(没有rabbitmq://
前缀)。