Rebus 发布异常处理

Rebus Publish Exception Handling

假设 rebus 无法将消息发布到 rabbitmq 或其他队列,处理此异常的最佳做法是什么。 我停止了 rabbitmq 服务并且 rebus 抛出了聚合异常。我可以在 try - catch 块中手动捕获此异常,但是在发生这种情况时是否有更好的解决方案来捕获异常?

首先:如果您在最初 sending/publishing 一条消息时遇到异常(例如,在处理网络请求时),您真的无能为力。抱歉 ;)

您可能应该 记录 - 彻底记录 - 您可以 的所有信息,然后确保设置日志记录,以便信息最终保存在文件或其他 持久日志。然后你应该有某种通知或流程来确保有人会在某个时候查看日志

无论您从事何种类型的工作,您都应该有这种日志记录。

根据您的信息的重要性,您还可以设置某种重试机制(尽管您应该注意不要消耗线程和太多内存,同时重试)。此外,由于您的 Web 应用程序应该能够随时回收,因此您可能 不应该(过多)依赖重试 .

不过,您可以做一些事情,以 最大限度地降低风险 最终陷入您无法 send/publish 的境地。

我建议您使用某种高可用性传输,例如 MSMQ(因为它有本地传出队列)、RabbitMQ(每台机器上有一个 shovel)或 Azure 服务总线或 Azure存储队列(如果您在 Azure 中)。

此外 - 如果您使用的是 MSMQ,并且您想要 发布 一个事件 - 我建议您先 await bus.Send(theEvent),然后在您处理消息时,你await bus.Publish(theEvent)。这是因为 Rebus(使用 MSMQ 传输)需要在订阅存储中进行查找,以便获取给定事件的所有订阅者。 虽然这不是 RabbitMQ 的问题,因为 Rebus 将使用 Rabbit 的主题来执行 pub/sub 并且与执行普通发送一样安全。

当您 sending/publishing 来自 Rebus 消息处理程序时,当然没有问题,因为接收操作将被回滚,最终传入的消息将在错误队列中结束。

我希望对这种情况有所了解 :)