首页 > 解决方案 > MassTransit UseCluster 导致应用程序失败

问题描述

我们为 RabbitMQ 设置了一个集群,我们使用 MassTransit 来管理消息类型、配置等。当我们关闭集群中的一个节点时,我们会直接在运行应用程序时遇到如下异常,这意味着整个应用程序已关闭。

{
    "Depth": 0,
    "ClassName": "RabbitMQ.Client.Exceptions.BrokerUnreachableException",
    "Message": "None of the specified endpoints were reachable",
    "Source": "RabbitMQ.Client",
    "StackTraceString": "   at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)\n   at MassTransit.RabbitMqTransport.Integration.ConnectionContextFactory.CreateConnection(ISupervisor supervisor)",
    "RemoteStackTraceString": null,
    "RemoteStackIndex": 0,
    "HResult": -2146232800,
    "HelpURL": null
},

备份节点后问题消失。但是通过高可用性设置,我们希望应用程序在某些节点不可用时选择另一个节点。我怀疑这是我们设置 MassTransit 的方式,它具有以下内容:

x.UsingRabbitMq((context, cfg) =>
   {
      cfg.Host("cluster", rmq.VHost, h =>
      {
         h.Username(rmq.Username);
         h.Password(rmq.Password);
         h.UseCluster(c =>
         {
             foreach (var node in rmq.Nodes)
             {
                 c.Node(node);
             }
         });
     });
     cfg.ConfigureEndpoints(context);
});

以前遇到过这个问题并知道公共交通中是否有任何配置我们可以用于应用程序“如果一个节点不可用则尝试下一个节点”的任何人?

标签: .netrabbitmqmasstransit

解决方案


它应该报告错误,但继续沿着列表向下连接到集群中的可用代理节点。如果您没有看到每隔几秒钟重复一次错误,则它找到了一个可用节点并已连接。

如果您查看完整日志(不仅仅是 ERROR 级别),您应该会看到到各个节点的连接尝试。


推荐阅读