有没有办法将事务标记为失败并让协调器增加重试计数器,但同时推迟事务处理,比如 2 小时?
在我的场景中,我正在数据库中查找一些数据,如果没有找到,我想将事务标记为失败,并将协调器中的重试次数增加到 1,并且我希望将这个失败的事务推迟几个小时。
假设数据库最终在一小时后更新相关数据,当编排器触发相关机器人并尝试在 2 小时后重新处理事务时,它将成功。
另一方面,如果数据库仍然不包含数据并且 2 小时过去了,事务将再次失败,我需要编排器将重试次数增加到 2,并将其再推迟 2 小时。
最后,如果 2 小时后数据仍然不存在(即 6 小时过去了),我希望事务再次失败,将重试次数增加到 3 并停止尝试处理它,假设它已达到设置的最大重试次数在 Orchestrator 的队列中。它可能会发送一封电子邮件通知管理员。
有几点不明白:
为什么不重试业务异常。对我来说,上述场景是一个失败的业务规则(即在数据库中找不到数据),但如果我理解“设置事务状态”工作流的状态,它将不会重试重新处理业务规则异常。对我来说毫无意义,好吧,至少根据我的情况。
这是否意味着在协调器中增加重试计数器的唯一方法是生成系统异常?这感觉不对,在处理这种异常时,我也不想按照 SetTransactionStatus 拍摄快照。我错过了什么吗?
此外,在调用推迟活动时,我可以看到它正在将事务状态从“失败”更改为“新”,这也不是理想的,但如果有必要可以忍受它。对我来说重要的是,重试计数器在调用时不会在协调器中重置,但由于在调用推迟活动时状态从失败更改为新,我担心它会重置计数器,这将是问题。
我还没有检查调用 Postpone 活动时重试次数是否仍然存在,因为我还没有完成整个过程。
实现这一目标的正确方法是什么?这可以实现吗?
谢谢
PS:为冗长的帖子道歉,但我认为我提供了尽可能多的细节。
更新-1
@kwoxer 建议这可能是一个重复的问题,但我不相信它是。
此处的 post enter 链接描述处理创建事务时状态会发生什么,并调用某些活动来更改状态,但它没有解决如何处理失败的业务规则以及如何处理重试。
如前所述,没有找到“数据”并希望在几个小时后重试应该可以使用内置功能实现,同时仍被视为业务规则异常,同时还依赖重试计数器,以便此操作不会永远进行.
它还应该让您更好地控制状态应该发生什么,即推迟失败的交易应该是有效的,并且状态不应重置为“新”,或者至少您应该可以选择应该设置的状态到。
我在对@kwoxer 的回复中发布了一个潜在的“解决方法”,但我认为这很丑陋,真的希望有一种方法可以通过内置功能来处理这个问题,我希望有人可能会建议我可能有的东西错过或更好的解决方法。
谢谢。