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

https://stackoverflow.com/questions/43954658
复制相似问题