在Masstransit上访问Docker RabbitMQ集群失败

时间:2017-08-08 08:17:28

标签: docker rabbitmq masstransit

我已经使用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'

1 个答案:

答案 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://前缀)。