gpt4 book ai didi

c# - Azure Durable Function 错误处理 : Is there a way to identify which retry you are on?

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:45 26 4
gpt4 key购买 nike

持久功能 documentation指定以下模式以设置在事件函数中引发异常时自动处理重试:

public static async Task Run(DurableOrchestrationContext context)
{
var retryOptions = new RetryOptions(
firstRetryInterval: TimeSpan.FromSeconds(5),
maxNumberOfAttempts: 3);

await ctx.CallActivityWithRetryAsync("FlakyFunction", retryOptions, "ABC");

// ...
}

但是我看不到一种方法来检查您在事件功能中进行了哪些重试:

[FunctionName("FlakyFunction")]
public static string[] MyFlakyFunction(
[ActivityTrigger] string id,
ILogger log)
{
// Is there a built-in way to tell what retry attempt I'm up to here?
var retry = ??

DoFlakyStuffThatMayCauseException();
}

编辑:我知道它可能可以通过将某种计数修改为 RetryOptions.Handle 委托(delegate)来处理,但这是一个糟糕的解决方案。它可以通过每次执行时维护外部状态来手动处理,但考虑到有一个内部重试计数,我只是想知道是否有任何方法可以访问它。主要用途是调试和日志记录,但我可以想到许多其他用途。

最佳答案

似乎没有办法识别重试。事件功能不知道状态和重试。当 CallActivityWithRetryAsync 调用时,DurableOrchestrationContext 调用 ScheduleWithRetry DurableTask frameworkOrchestrationContext 类的方法:

public virtual Task<T> ScheduleWithRetry<T>(string name, string version, RetryOptions retryOptions, params object[] parameters)
{
Task<T> RetryCall() => ScheduleTask<T>(name, version, parameters);
var retryInterceptor = new RetryInterceptor<T>(this, retryOptions, RetryCall);
return retryInterceptor.Invoke();
}

Invoke RetryInterceptor 类上的方法被调用,并在最大重试次数上执行 foreach 循环。此类不公开获取重试次数的属性或方法。

另一个有助于调试的解决方法是在事件函数中记录语句。当您在本地运行它时,您可以在那里放置一个断点,以查看它在那里停止的频率。请注意,已经有一个 feature request处理更好的重试日志记录。如果您觉得更合适,您可以在那里添加您的反馈或提出新问题。

说实话,我认为一个事件不知道状态和重试是件好事。这应该是协调者的责任。但是,如果您可以获得一些关于重试的统计数据以查看是否存在性能下降的趋势,这将很有用。

关于c# - Azure Durable Function 错误处理 : Is there a way to identify which retry you are on?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57573431/

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