使用没有毒队列的队列触发器取消 Azure 函数

Cancelling an Azure Function with a queue trigger without the poison queue

我们正在使用以下设置:

我们使用带有队列触发器的 Azure Functions 来处理 JSON 消息队列。

这些消息每个都刚刚通过 HTTP POST 转发到 API 端点以进行进一步处理。

API可以return3种可能的HTTP状态码; 200(正常)、400(错误请求)、500(内部服务器错误)。

如果 API returns 200,则消息已正确处理,一切正常。队列触发器功能似乎可以自动删除队列消息,这对我们来说很好。

如果 API return 的 400,API 具有获取消息并将其添加到 table 的逻辑,其状态表明它格式错误否则无法处理。因此我们可以接受消息自动从队列中删除并且 Azure 函数可以正常结束。

如果 API returns 500,我们确保函数重试将消息发布到 API,直到状态代码为 200 或 400(因为可能有API 的问题,我们不想丢失消息)。我们正在使用 Polly 来实现这一点。我们已经设置好它,所以它基本上会在指数退避中永远重试。

我们最近遇到了这个问题:

在某些情况下,API 会对某些消息 return 500。此错误完全是暂时的,并且会不可预测地来来去去。使用 Polly 永远重试会很好,除非不是所有消息都会导致此错误,并且本质上 "bad" 消息会阻止 "good" 消息被处理。

例如,假设队列中有 50 条消息。队列前面的前 32 条消息是 "bad",有时 return 来自 API 的 500 条消息。这些消息由 Azure Functions 获取并同时处理。其他 18 条消息是 "good" 并将 return 200。这些 "good" 条消息将在成功处理 "bad" 条消息之前处理。本质上,坏的会导致好的交通堵塞。

我的解决方案是,如果当前消息已重试一定次数,则尝试取消 Azure Functions 的执行。我想也许消息会在一段时间后变得可见,但在那段时间它给了好的消息进行处理的时间。但是,我不知道如何在不导致队列消息被完全删除或推送到有毒队列的情况下取消函数的执行。

我可以使用队列触发函数来实现吗?这是我可以使用计时器触发器来做的事情吗?

非常感谢!

正如您所提到的,您不能有效地取消执行,所以我建议完成该功能并将消息移动到稍后处理的队列中。

几点建议:


编辑:Here's a cheatsheet of parameter binding types