【问题标题】:Recovering from failure to create RabbitMQ transport connection with Rebus使用 Rebus 从创建 RabbitMQ 传输连接失败中恢复
【发布时间】:2019-01-30 16:05:00
【问题描述】:

我们使用简单的设置来使用 Rebus 订阅队列。我们需要确保如果 RabbitMQ 队列不可用(例如服务关闭),我们可以检测到并稍后重试。我们还需要处理成功连接后 RabbitMQ 出现故障的可能性(订阅机制是否可以处理这个问题?

这是我们的示例设置;

var activator = new BuiltinHandlerActivator();

_bus = Configure
    .With(activator)
    .Transport(t => t.UseRabbitMq(configuration["ConnectionStrings:RabbitMQ"], "QueueName"))
    .Routing(r => r.TypeBased().Map<Message>("QueueName"))
    .Options(b => b.SimpleRetryStrategy("QueueName_Error"))
    .Start();

activator.Register(() => messageHandler);
_bus.Subscribe<Message>().Wait();

请注意,我们使用的是 .net core。

【问题讨论】:

    标签: .net-core rabbitmq asp.net-core-2.1 rebus rebus-rabbitmq


    【解决方案1】:

    如果 Rebus 无法成功连接到 RabbitMQ,它会拒绝启动。原因是它需要在开始接收消息之前初始化自己的输入队列。

    有人可能会争辩说,Rebus 应该简单地启动并等待连接成功建立,然后进行初始化,但这可能会隐藏配置错误,例如如果您部署的应用程序连接到错误的主机名。

    因此,当您的应用程序启动时,代理需要在那里。然后鼓励您让启动期间的任何错误冒泡,例如这样无论您使用哪种托管机制来运行您的进程,都会检测到这一点。

    一旦启动,Rebus 将维护一个 RabbitMQ 连接池 (IModels),检测并丢弃已关闭或有故障的连接。除此之外,Rebus 依赖 RabbitMQ 的驱动程序从连接错误中恢复,所以如果你在 high availability mode 运行 RabbitMQ,你可以使用多个 RabbitMQ 连接字符串(由 ; 分隔)配置 Rebus,然后它会自动失败如果出现错误,则转到可用节点。

    最后一件事:只要您正在处理消息,您就是安全的:Rebus 将在确认传入消息之前发送从 Rebus 处理程序发送和发布的所有传出消息。因此,at least once delivery guarantee 可以贯穿始终。

    唯一需要注意的是初始发送!也就是说,当您发送第一条消息时(例如,从 Web 请求处理程序中或任何可能的地方),您需要确保您有另一种存储消息数据的方法,如果 Rebus 无法连接到任何RabbitMQ 节点。

    如果 Rebus 无法发送初始消息,您将收到异常,然后由您来做一些明智的事情。一个低调实用的解决方案(至少在许多第一版系统中,可能还会在以后的许多生产系统中?)是简单地将错误与您打算在消息中发送的数据一起记录到文件中。

    我希望这可以解决您可能遇到的任何问题?如果没有,请再问一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2014-06-18
      相关资源
      最近更新 更多