【发布时间】:2015-12-07 08:58:12
【问题描述】:
假设 rebus 无法将消息发布到 rabbitmq 或其他队列,处理此异常的最佳实践是什么。 我停止了 rabbitmq 服务并 rebus 抛出了 Aggregate 异常。我可以在 try-catch 块中手动捕获这个异常,但是当这种情况发生时,有没有更好的解决方案来捕获异常?
【问题讨论】:
标签: rebus
假设 rebus 无法将消息发布到 rabbitmq 或其他队列,处理此异常的最佳实践是什么。 我停止了 rabbitmq 服务并 rebus 抛出了 Aggregate 异常。我可以在 try-catch 块中手动捕获这个异常,但是当这种情况发生时,有没有更好的解决方案来捕获异常?
【问题讨论】:
标签: rebus
首先:如果您在最初发送/发布消息时遇到异常(例如,在处理网络请求时),您真的无能为力。对不起;)
您可能应该彻底记录所有可以记录的信息,然后确保设置日志记录,以便信息最终保存在文件或其他一些持久日志中。然后您应该有某种通知或流程,以确保有人会在某个时候查看日志。
无论您从事什么类型的工作,您都应该有这种日志记录。
根据您的信息的重要性,您还可以设置某种重试机制(尽管重试时应注意不要消耗线程和过多的内存)。此外,由于您的 Web 应用程序应该能够随时回收,您可能不应该(过多地)依赖重试。
不过,您可以做一些事情,以最大限度地降低风险,最终导致您无法发送/发布。
我可以建议您使用某种高可用性传输,例如 MSMQ(因为它具有本地传出队列)、RabbitMQ(每台机器上都有一个 shovel),或者如果您使用 Azure 服务总线或 Azure 存储队列'在 Azure 中。
此外 - 如果您使用 MSMQ,并且想要发布一个事件 - 我建议您先await bus.Send(theEvent),然后在您处理消息时,您await bus.Publish(theEvent)。这是因为 Rebus(使用 MSMQ 传输)需要在订阅存储中进行查找,以便获取给定事件的所有订阅者。 这不是 RabbitMQ 的问题,因为 Rebus 将使用 Rabbit 的主题进行发布/订阅,并且与进行普通发送一样安全。
当您从 Rebus 消息处理程序中发送/发布时,当然没有问题,因为接收操作将被回滚,最终传入的消息将最终进入错误队列。
我希望能对情况有所了解:)
【讨论】: