【发布时间】:2016-11-30 19:17:18
【问题描述】:
为了处理间歇性 RabbitMQ 连接问题或 RabbitMQ 完全关闭,将 MassTransit 配置为容错的正确方法是什么?我已经在 2 台不同的机器之间建立了一个 RabbitMQ 集群并配置了 HA,以便一切都被镜像。我还在主动/被动模式下设置了 F5 负载均衡器,以便所有流量都定向到主节点,但如果运行状况检查失败,它将故障转移到辅助节点。我希望此类故障转移后的任何客户端连接都将继续成功,但我在这里遇到了麻烦。当我在主节点上停止 RabbitMQ 时,客户端应用程序开始记录一堆 MassTransit 错误,如下所示:
RabbitMQ connection failed: Connect failed: myrabbithost.mycompany.com:5671/
即使没有任何活动发生,这些错误也会发生 - 没有发布、Client.Request 等。由于 MassTransit 显然放弃了连接,最终错误停止,并且客户端应用程序崩溃。在查看 MassTransit 源时,我认为是 RabbitMqReceiveTransport.Receive 在“RetryUntilCancelled”方法中生成这些错误。看起来它正在使用内部 ConnectionRetryPolicy,那么那里可以配置一些东西吗?
我在 Global.asax 中实例化我的总线实例,启动它并在 IIS 启动时将它保存在内存中,我不知道这是否是一个问题;在查看使用 Unity 容器的 MassTransit 的文档时,似乎推荐的做法是允许 Unity 默认使用 TransientLifetimeManager,以便每次容器解析它时都会拆除并重新创建总线实例。
【问题讨论】:
-
您使用的是哪个版本的 MassTransit?
-
我正在使用 MassTransit 3.4.1
-
在整个过程中保持总线活着是对的。它不应该是暂时的。一旦代理可用,它也应该重新连接。
-
总线保持一个临时端点活动并连接到 RabbitMQ。您确定您的主机名在 F5 上正确故障转移吗?我们在生产中具有相同的设置,并且在我们删除主节点的第二秒失败。
-
我们的 F5 正在使用每 5 秒检查一次的运行状况监视器,所以这可能是问题所在?它在访问 myrabbithost.mycompany.com:15671/api 时正在寻找 HTTP 200。克里斯,你是如何设置健康监测器的?我是F5的新手。您能分享一下您为健康监测器所做的工作吗?顺便说一句,感谢创建 MassTransit 和 TopShelf - 使用这些高质量的免费工具非常好!
标签: c# rabbitmq masstransit