Azure 服务总线:为无法处理的消息实施指数重试策略的最佳方式

dvi*_*nis 9 service azure bus azureservicebus azure-servicebus-topics

我不断地以窥视模式接收消息,如果处理失败(不是传递),我会放弃它们。但是,该消息会立即再次变得可用并被再次接收以进行处理。它再次快速失败,并且在最大交付量之后它是死信的。

有没有办法配置主题/订阅在消息被放弃后在发布之前等待?优选以指数方式。

当然,我也愿意通过代码提出建议。

Rob*_*gan 9

没有办法在服务总线配置中设置指数退避。我遇到了同样的问题,并做了以下工作:

  1. 使消息出列,并将消息标记为已接收。
  2. 在 try/catch 块内执行处理。如果出现异常,则在未来的某个时间点将具有预定传递的新消息加入队列。

我们已经将我们的服务总线消息队列负载包装在一个指定传递尝试次数的类中。我们将交付尝试的次数乘以一个常数,然后将该数字添加到当前日期时间,以便将来安排交付。在超过我们想要尝试的传递尝试次数后,我们明确地将消息死信。

编辑 7-17-2020 考虑使用 Azure Durable Task Framework,它内置了可自定义的重试策略。

  • 任何在不幸的时刻停止执行代码的故障都可能导致数据丢失,因为消息已经完成。在某些事务系统中,这可能是不可接受的,而在其他系统中,罕见的数据丢失并不是什么问题。如果担心数据丢失,请不要将第一条消息标记为完成,直到第一条消息成功处理或替换消息已成功入队。那么最糟糕的情况是您在将替换排队之后和第一次完成之前崩溃 - 并且在重新启动时您将收到两条消息,但数据丢失为零。 (4认同)