如何在 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; }}不幸的是,这个解决方案很弱,因为它没有上下文(我不知道它是哪种尝试,因此我不能限制调用次数和修改时间(指数退避))。内部重试策略也不受欢迎,因为它会大大增加成本(定价模型)。
3 回答
月关宝盒
TA贡献1772条经验 获得超5个赞
微软在 2020 年 11 月(预览)前后添加了重试策略,支持指数退避:
[FunctionName("Test")]
[ExponentialBackoffRetry(5, "00:00:04", "00:15:00")] // retries with delays increasing from 4 seconds to 15 minutes
public static async Task Run([QueueTrigger("queue-test")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
// ...
}
POPMUISE
TA贡献1765条经验 获得超5个赞
要考虑的一种选择是让您的函数调用一个逻辑应用程序,该应用程序将延迟设置为您所需的时间量,然后在延迟后再次调用该函数。您还可以使用一些持久性存储将其他重试逻辑(例如尝试次数)添加到逻辑应用程序以记录您的尝试次数。如果存在连接问题,您只会调用逻辑应用程序。
或者,您可以将流程起点转移到逻辑应用程序,因为它也可以触发(思考绑定)队列消息。在任何一种情况下,逻辑应用程序都添加了暂停和重新调用函数和/或进程的能力。
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报
0/150
提交
取消