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