Dav*_*mid 2 azure azure-queues azure-functions
我们使用以下设置:
我们使用带有队列触发器的 Azure 函数来处理 JSON 消息队列。
这些消息均通过 HTTP POST 转发到 API 端点,以进行进一步处理。
API可以返回3种可能的HTTP状态码;200(正常)、400(错误请求)、500(内部服务器错误)。
如果 API 返回 200,则消息已正确处理,一切正常。队列触发功能似乎会自动删除队列消息,这对我们来说没问题。
如果 API 返回 400,则 API 具有获取消息并将其添加到表中的逻辑,该表的状态表明消息格式错误或无法处理。因此,我们同意消息自动从队列中删除,并且 Azure Function 可以正常结束。
如果 API 返回 500,我们确保函数重试将消息发布到 API,直到状态代码为 200 或 400(因为 API 可能存在问题,我们不希望丢失消息)。我们正在使用Polly来实现这一目标。我们对其进行了设置,因此它本质上会以指数退避方式永远重试。
然而我们最近遇到了这个问题:
在某些情况下,API 会针对某些消息返回 500。此错误完全是暂时的,并且会不可预测地出现和消失。使用 Polly 永远重试会很好,除非并非所有消息都会导致此错误,并且本质上“坏”消息会阻止“好”消息的处理。
举例来说,我的队列中有 50 条消息。队列前面的前 32 条消息是“坏”消息,有时会从 API 返回 500。这些消息由 Azure Function 获取并同时处理。其他 18 条消息是“好”消息,将返回 200。在成功处理“坏”消息之前,不会处理这些“好”消息。本质上,坏的会导致好的交通堵塞。
我的解决方案是,如果当前消息已重试一定次数,则尝试取消 Azure 函数的执行。我想也许该消息会在一段时间后变得可见,但在那段时间里,它给了好的消息时间来处理。但是,我不知道如何取消该函数的执行,而不导致队列消息被完全删除或推送到有害队列。
我可以使用队列触发功能来实现这一点吗?我可以使用计时器触发器来代替吗?
非常感谢!
正如您所提到的,您无法有效地取消执行,因此我建议完成该函数并将消息移动到队列中,稍后将在其中进行处理。
一些建议:
CloudQueue到输入队列的类型的输出绑定。当遇到有问题的消息时,请使用initialVisibilityDelay参数将其添加到输出队列,以将其推到队列的末尾: https: //learn.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage。 queue.cloudqueue.addmessage?view=azure-dotnet编辑:这是参数绑定类型的备忘单
| 归档时间: |
|
| 查看次数: |
2930 次 |
| 最近记录: |