gpt4 book ai didi

c# - 如何使用 EasyNetQ/RabbitMQ 进行错误处理

转载 作者:可可西里 更新时间:2023-11-01 03:07:59 32 4
gpt4 key购买 nike

我在 C# 中使用 RabbitMQ 和 EasyNetQ 库。我在这里使用发布/订阅模式。我还有一些问题希望有人能帮助我解决:

  1. 如果在使用消息时出现错误,它会自动移至错误队列。我如何实现重试(以便它被放回原始队列,当它处理 X 次失败时,它被移动到死信队列)?
  2. 据我所知,总是有 1 个错误队列用于转储来自所有其他队列的消息。如何让每种类型有 1 个错误队列,以便每个队列都有自己关联的错误队列?
  3. 如何轻松重试错误队列中的消息?我试过 Hosepipe,但它只是将消息重新发布到错误队列而不是原始队列。我也不太喜欢这个选项,因为我不想在控制台中摆弄。最好我只针对错误队列进行编程。

有人吗?

最佳答案

您在使用 EasyNetQ/RabbitMQ 时遇到的问题是,与 SQS 或 Azure 服务总线/队列等其他消息服务相比,它更加“原始”,但我会尽力为您指明正确的方向.

问题 1.

这将由您来完成。最简单的方法是在 RabbitMQ/EasyNetQ 中 No-Ack 一个消息,它会被放在队列的头部让你重试。这并不是真正可取的,因为它几乎会立即重试(没有时间延迟),并且还会阻止处理其他消息(如果您有一个预取计数为 1 的订阅者)。

我见过使用“MessageEnvelope”的其他实现。因此,一个包装类,当消息失败时,您可以在 MessageEnvelope 上增加一个重试变量,并将消息重新传递回队列。您将不得不这样做并围绕您的消息处理程序编写包装代码,这不是 EasyNetQ 的功能。

使用上面的方法,我也看到人们使用信封,但允许消息是死信。一旦它在死信队列中,就会有另一个应用程序/工作人员从死信队列中读取项目。

上述所有这些方法都有一个小问题,即在处理消息时并没有任何好的方法来实现对数/指数/任何类型的增加延迟。在将消息返回到队列之前,您可以在代码中“保留”该消息一段时间,但这不是一个好的解决方法。

在所有这些选项中,您自己的自定义应用程序读取死信队列并根据包含重试计数的信封决定是否重新路由消息可能是最好的方法。

问题 2.

您可以使用高级 API 为每个队列指定死信交换。 (https://github.com/EasyNetQ/EasyNetQ/wiki/The-Advanced-API#declaring-queues)。然而,这意味着您将不得不在几乎所有地方使用高级 API,因为使用订阅/发布的简单 IBus 实现会查找基于消息类型和订阅者名称命名的队列。使用自定义队列声明意味着您将自己处理队列的命名,这意味着当您订阅时,您将需要知道您想要的名称等。不再为您自动订阅!

问题 3

错误队列/死信队列只是另一个队列。您可以收听此队列并使用它执行您需要执行的操作。但是实际上并没有任何开箱即用的解决方案听起来可以满足您的需求。

关于c# - 如何使用 EasyNetQ/RabbitMQ 进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914640/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com