访问Docker RabbitMQ集群在Masstransit上失败
我已经用RabbitMQ托pipe了两个Docker容器(请参阅下面的Docker文件)。 我使用rabbitmqctl join_cluster
将两个RabbitMQ实例组合到了一个集群中。 两个RabbitMQ实例的集群名称都是rabbit@rabbit
。
如果我使用rabbitmq://localhost:5673/
作为连接URL,则可以与群集的单个实例进行通信。 但是,如果我使用rabbitmq://rabbit@rabbit/
,则MassTransit无法连接。
如何为MassTransit构build连接string,该连接string可以与RabbitMQ集群(具有故障切换pipe理)进行通信?
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'
集群名称没有提到物理连接参数。 rabbitmq://rabbit@rabbit/
只在现有的RabbitMQ上下文中才有意义,但rabbitmq://rabbit@rabbit/
不能解释客户端在哪里find你的节点。
在MassTransit中,您需要指定其他主机configuration来使用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://
前缀)的列表。
我有一个类似的问题试图使用MassTransit连接到一个3节点RabbitMq群集使用下面的示例代码
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { var host = cfg.Host(new Uri("rabbitmq://myclustername"), h => { h.Username("admin"); h.Password("admin"); h.UseCluster(c => { c.Node("192.168.1.10:5672"); c.Node("192.168.1.10:5673"); c.Node("192.168.1.10:5674"); }); }); });
但是,我不断收到以下错误信息:
发生MassTransit.RabbitMqTransport.RabbitMqConnectionException HResult = 0x80131500消息=连接失败:admin @ mycluster:5672 / Source = TestPublisher StackTrace:位于C:_Dev \ RMQClusterDemo \ TestPublisher \ Program.cs中TestPublisher.Program.Main(String [] args) 50行
内部exception1:BrokerUnreachableException:没有指定的端点是可达内部exception2:ConnectFailureException:连接失败内部exception3:SocketException:没有这样的主机是已知的
看来它没有使用我提供的集群节点列表
如果我删除UseCluster部分并用任何一个节点的IP地址replace“MyCluster”,上面的示例对于单个节点将正常工作。
任何想法如何得到这个工作?