如何在 Azure Functions 中实现指数退避?
我有一个依赖于外部 API 的函数。我想使用重试策略处理此服务不可用的情况。当队列中出现新消息时触发此函数,在这种情况下,此策略默认启用:
对于大多数触发器,在函数执行过程中发生错误时没有内置的重试。支持重试的两个触发器是 Azure 队列存储和 Azure Blob 存储。默认情况下,这些触发器最多重试五次。在第五次重试后,两个触发器都会将消息写入一个特殊的毒物队列。
不幸的是,重试在异常 (TimeSpan.Zero) 之后立即开始,在这种情况下这是毫无意义的,因为服务很可能仍然不可用。 有没有办法动态修改消息在队列中再次可用的时间?
我知道我可以设置visibilityTimeout(host.json 参考),但它是为所有队列设置的,这不是我想在这里实现的。
我找到了一种解决方法,但这远非理想的解决方案。如果出现异常,我们可以再次将消息添加到队列中并为此消息设置可见性超时:
[FunctionName("Test")]
public static async Task Run([QueueTrigger("queue-test")]string myQueueItem, TraceWriter log,
ExecutionContext context, [Queue("queue-test")] CloudQueue outputQueue)
{
if (true)
{
log.Error("Error message");
await outputQueue.AddMessageAsync(new CloudQueueMessage(myQueueItem), TimeSpan.FromDays(7),
TimeSpan.FromMinutes(1), // <-- visibilityTimeout
null, null).ConfigureAwait(false);
return;
}
}
不幸的是,这个解决方案很弱,因为它没有上下文(我不知道它是哪种尝试,因此我不能限制调用次数和修改时间(指数退避))。
内部重试策略也不受欢迎,因为它会大大增加成本(定价模型)。
月关宝盒
POPMUISE
相关分类