【问题标题】:MassTransit how to handle RabbitMQ going downMassTransit 如何处理 RabbitMQ 宕机
【发布时间】: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


【解决方案1】:

这些客户端崩溃的发生是因为我像这样使用 Task.Wait():

Task.Run(() => bus.Publish(new TestMessage { Id = num })).Wait();

而不是这个:

Task.Run(() => bus.Publish(new TestMessage { Id = num }));

如果没有 .Wait(),即使 RabbitMQ 出现故障,客户端也会保持运行。现在的问题是,在 RabbitMQ 宕机但在 F5 故障转移到辅助节点之前发送的任何消息都将丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多