使用消息队列绑定时如何处理重新运行的 Azure 函数?

How to handle an Azure Function rerunning when using message queue binding?

我有一个 v1 Azure 函数,它由写入 Azure 存储消息队列的消息触发。

Azure 函数需要对 SharePoint Online 执行多个更新。这些操作有时会失败。这会导致消息返回到队列并重新处理。

我在开发功能的时候,没有考虑到可能会部分完成然后重启。我做了一些研究,听起来我需要修改它才能重入。

有没有我应该遵循的设计模式来解决这个问题,而不必添加大量检查来确定上一次执行是否已经执行了操作?或者,是否有任何 Azure 功能可以提供帮助(除了现有的消息重试和毒队列)

听起来您需要做一些事情 re-engineering。我们的团队遇到了类似的问题,并在几年前编写了 home-grown 解决方案。但我们最终放弃了我们的解决方案并选择了 Azure Durable Functions.

不会说谎 - 这个框架有一些复杂性,我花了一些时间来理解它。查看函数链接模式。

我们的处理需要多个步骤,所有步骤都必须完成。我们跨越多个数据存储(更新 Cosmos Db、Azure SQL、Blob 存储等),因此不支持跨多个 PaaS 产品的分布式事务。 Durable Functions 可让您将流程分解为离散的步骤。如果某个步骤失败,编排器将 re-run 根据重试策略执行该步骤。

所以简而言之,我们使用 Durable Task Activity 函数来尝试每一步。如果由于我们认为是暂时性错误而导致该步骤失败,我们将重试。如果是不可恢复的错误,我们不会重试。