gpt4 book ai didi

c# - MassTransit 如何处理 RabbitMQ 宕机

转载 作者:行者123 更新时间:2023-11-30 12:56:27 26 4
gpt4 key购买 nike

将 MassTransit 配置为容错以处理间歇性 RabbitMQ 连接问题或 RabbitMQ 完全崩溃的正确方法是什么?我已经在两台不同的机器之间设置了一个 RabbitMQ 集群并配置了 HA,以便镜像所有内容。我还有一个以主动/被动模式设置的 F5 负载均衡器,以便所有流量都定向到主节点,但如果健康检查失败,它会故障转移到辅助节点。我希望这种故障转移后的任何客户端连接都能继续成功,但我在这里遇到了麻烦。当我在主节点上停止 RabbitMQ 时,客户端应用程序开始记录一堆 MassTransit 错误,如下所示:

RabbitMQ connection failed: Connect failed: myrabbithost.mycompany.com:5671/

即使没有事件发生,这些错误也会发生 - 没有 Publish、Client.Request 等。最终,由于 MassTransit 明显放弃连接,错误停止,客户端应用程序崩溃。在查看 MassTransit 源代码时,我认为是 RabbitMqReceiveTransport.Receive 在“RetryUntilCancelled”方法中产生了这些错误。看起来它使用的是内部 ConnectionRetryPolicy,那么是否有可以在那里配置的东西?

我在 Global.asax 中实例化我的总线实例,启动它并在 IIS 启动时将其保存在内存中,我不知道这是否是一个问题;在查看使用 Unity 容器的 MassTransit 文档时,推荐的做法似乎是允许 Unity 默认使用 TransientLifetimeManager,这样每次容器解析总线实例时都会将其拆除并重新创建。

最佳答案

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

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

而不是这个:

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

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

关于c# - MassTransit 如何处理 RabbitMQ 宕机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com