gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:55:12 24 4
gpt4 key购买 nike

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

我有一个依赖于外部 API 的函数。我想使用重试策略来处理此服务的不可用性。当队列中出现新消息时会触发此功能,在这种情况下,此策略默认开启:

For most triggers, there is no built-in retry when errors occur during function execution. The two triggers that have retry support are Azure Queue storage and Azure Blob storage. By default, these triggers are retried up to five times. After the fifth retry, both triggers write a message to a special poison queue.

不幸的是,重试在异常 (TimeSpan.Zero) 之后立即开始,在这种情况下这是毫无意义的,因为服务很可能仍然不可用。有没有办法动态修改消息在队列中再次可用的时间?

我知道我可以设置 visibilityTimeout ( host.json reference ),但它是为所有队列设置的,这不是我想要在这里实现的目标。

我找到了一种解决方法,但这远非理想的解决方案。如果出现异常,我们可以将消息重新添加到队列中,并为该消息设置visibilityTimeout:

[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;
}
}

不幸的是,这个解决方案很弱,因为它没有上下文(我不知道它是什么尝试,因此我无法限制调用次数和修改时间(指数退避))。

内部重试政策也不受欢迎,因为它会大幅增加成本(定价模型)。

最佳答案

微软添加了retry policies 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)
{
// ...
}

关于c# - 如何在Azure Functions中实现指数退避?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50817971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com