【问题标题】:MassTransit how to handle Start/Stop when Queue is downMassTransit 如何在队列关闭时处理启动/停止
【发布时间】:2016-12-13 15:09:52
【问题描述】:

我正在使用 RabbitMQ 3.6.0 和 MasstTransit 3.2.0 并将其配置如下:

// MassTransit
IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri(configuration.Url), h =>
    {
        h.Username(configuration.User.UserName);
        h.Password(configuration.User.Password);
    });

    cfg.UseXmlSerializer();

    cfg.ReceiveEndpoint(host, configuration.Queue, e =>
    {
    });
});

我开始如下:

// start the bus
IBusControl bus = container.Resolve<IBusControl>();
bus.Start();

不幸的是,当 RabbitMQ 关闭时,这是我架构中的一个场景,方法 bus.Start() 会挂起一段时间,直到它爆炸并抛出异常。 是否有我可以使用的替代模式,以便应用程序通过“日志”通知队列已关闭,我可以稍后尝试运行bus.Start()

【问题讨论】:

  • 不确定 MassTransit 中是否有任何内容(我会这么认为),但我会继续重试。如果您对此无能为力,请继续尝试直到修复为止。甚至可能有越来越长的重试间隔。
  • 那么,一种不断尝试连接的递归模式,可能在一个单独的线程上,这样它就不会阻止应用程序启动?那么只有消息消费者的应用呢?
  • 这取决于您希望系统在 RabbitMQ 出现故障时如何反应。如果您需要采取行动(重新启动它),那么吹气可能是最好的方法。如果 RabbitMQ 在某些时候可以自行修复,那么重试可能是最好的解决方案。您还可以让应用程序在崩溃之前重试一定数量的尝试。我们也在使用 RabbitMQ,有时连接会中止,典型的消费者,然后我们就再试一次。
  • 您可以使用像 Polly github.com/App-vNext/Polly 这样的瞬态故障处理库来协调重试方面,包括指数退避[披露:我领导这个库]。取决于 MassTransit 对这方面的控制程度。然后,您需要决定(正如其他人所说)是否在 RabbitMQ 不可用的情况下启动您的进程(并以某种方式存储失败的消息操作以供以后处理),或者是否在适当的重试后对 RabbitMQ 不可用进行打击(无法启动您的进程)。

标签: c# rabbitmq masstransit


【解决方案1】:

无需手动重试bus.Start(),就像您处理抛出的异常 (RabbitMqConnectionException),MassTransit(我们使用的是 v3.5.5)将继续尝试在后台建立 RabbitMQ 连接。即使 RabbitMQ 仍然不可用,第二次调用 bus.Start() 总是会成功。

在这种情况下,我们捕获bus.Start() 上引发的异常并对其进行评估以查看它是暂时的还是永久性的错误。如果它是永久的,则终止应用程序。如果它是暂时的,那么我们启动应用程序,然后使用 Polly 重试任何重要的 bus.Publish()/bus.Send() 在 RabbitMQ 离线时失败的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 2017-03-25
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多