使用没有毒性队列的队列触发器取消Azure功能

时间:2017-05-13 15:09:11

标签: azure azure-functions azure-queues

我们正在使用以下设置:

我们正在使用带有队列触发器的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功能的执行,如果当前消息已经重试了一定次数。我想也许这段消息会在一段时间后变得可见,但在那段时间里,它会给好消息留出时间进行处理。但是,我不知道如何取消该函数的执行,而不会导致队列消息被完全删除或推送到毒性队列。

我是否可以使用队列触发功能实现此目的?这是我可以使用定时器触发器做的事情吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

正如您所提到的,您无法有效取消执行,因此我建议完成该功能并将消息移至队列中,以便稍后处理。

一些建议:

修改:Here's a cheatsheet of parameter binding types

enter image description here