【发布时间】: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