为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Azure Functions 中实现指数退避?

如何在 Azure Functions 中实现指数退避?

C#
FFIVE 2021-08-07 17:08:32
如何在 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)

{

    // ...

}


查看完整回答
反对 回复 2021-08-07
?
POPMUISE

TA贡献1765条经验 获得超5个赞

要考虑的一种选择是让您的函数调用一个逻辑应用程序,该应用程序将延迟设置为您所需的时间量,然后在延迟后再次调用该函数。您还可以使用一些持久性存储将其他重试逻辑(例如尝试次数)添加到逻辑应用程序以记录您的尝试次数。如果存在连接问题,您只会调用逻辑应用程序。

或者,您可以将流程起点转移到逻辑应用程序,因为它也可以触发(思考绑定)队列消息。在任何一种情况下,逻辑应用程序都添加了暂停和重新调用函数和/或进程的能力。


查看完整回答
反对 回复 2021-08-07
  • 3 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信