Azure 持久函数 - 即使在完成所有任务后状态仍为 运行
Azure durable functions - status is running even after completing all the tasks
与我之前的问题相关 - link
我已经使用 HttpStart 创建了一个持久作业,以便通过 http 请求调用它(代码来自 MSDN 的示例代码)。
在我的持久作业中,我编写了逻辑来循环并调用 activity 触发器 600 次。
public static async Task<List<BusinessRules.RuleResponse>> Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
var data = await context.CallActivityAsync<BusinessRules.CustomersData>("XmlDeserialiser");
var tasks = new List<Task<BusinessRules.RuleResponse>>();
for (int i = 0; i < 600; i++)
{
tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule1", data));
// tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data));
// tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data));
}
await Task.WhenAll(tasks);
var result = tasks.Select(x => x.Result).ToList();
return result;
}
activity触发器只是延迟 10 毫秒,然后 return 对象。
[FunctionName("Rule1")]
public static async Task<BusinessRules.RuleResponse> Run(
[ActivityTrigger] BusinessRules.CustomersData data)
{
await Task.Delay(10);
return new BusinessRules.RuleResponse()
{
IsValid = true,
RuleName = "Rule1"
};
}
这个练习背后的想法是我的 Durable 函数应该为它收到的每个请求执行 600 个业务验证规则。
当我用 600 循环执行上述函数时,作业状态总是返回 "Running"。如果将循环计数更改为 500,它的工作没有任何问题,结果是 returns。我在我的本地机器和 Azure 上测试了这个。在两种环境中都是一样的。但是,在我的本地机器上,我发现作业已完成,我可以在 return result;
的 Durablefunction 中找到调试点,但状态始终显示为 "running"。
看起来 Durable functions 完成了工作,但由于某种原因数据没有登录到 Azure 存储表,因此状态仍然是 运行。
请指教
鉴于它适用于较小的数字而不是较大的数字,我的猜测是您 运行 遇到了由于我们缺少 support for large messages. Another user opened a similar issue here 而导致的问题,您可能会看到同样的情况症状。
如果是这样,问题出在数据的大小 return 此行编辑:
var result = tasks.Select(x => x.Result).ToList();
序列化数据(序列化为 JSON 并作为 UTF-32 数据存储在 Azure 存储中)的大小不得超过 64 KB。如果您删除 return 值或如果您 return 一个较小的值,协调器是否在 600 的情况下完成?
在短期内,我们计划通过在有人尝试 return 从函数中获取过多数据时抛出异常来解决此症状。从长远来看,我们将添加对任意大 return 值的支持。
与我之前的问题相关 - link
我已经使用 HttpStart 创建了一个持久作业,以便通过 http 请求调用它(代码来自 MSDN 的示例代码)。
在我的持久作业中,我编写了逻辑来循环并调用 activity 触发器 600 次。
public static async Task<List<BusinessRules.RuleResponse>> Run(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
var data = await context.CallActivityAsync<BusinessRules.CustomersData>("XmlDeserialiser");
var tasks = new List<Task<BusinessRules.RuleResponse>>();
for (int i = 0; i < 600; i++)
{
tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule1", data));
// tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data));
// tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data));
}
await Task.WhenAll(tasks);
var result = tasks.Select(x => x.Result).ToList();
return result;
}
activity触发器只是延迟 10 毫秒,然后 return 对象。
[FunctionName("Rule1")]
public static async Task<BusinessRules.RuleResponse> Run(
[ActivityTrigger] BusinessRules.CustomersData data)
{
await Task.Delay(10);
return new BusinessRules.RuleResponse()
{
IsValid = true,
RuleName = "Rule1"
};
}
这个练习背后的想法是我的 Durable 函数应该为它收到的每个请求执行 600 个业务验证规则。
当我用 600 循环执行上述函数时,作业状态总是返回 "Running"。如果将循环计数更改为 500,它的工作没有任何问题,结果是 returns。我在我的本地机器和 Azure 上测试了这个。在两种环境中都是一样的。但是,在我的本地机器上,我发现作业已完成,我可以在 return result;
的 Durablefunction 中找到调试点,但状态始终显示为 "running"。
看起来 Durable functions 完成了工作,但由于某种原因数据没有登录到 Azure 存储表,因此状态仍然是 运行。
请指教
鉴于它适用于较小的数字而不是较大的数字,我的猜测是您 运行 遇到了由于我们缺少 support for large messages. Another user opened a similar issue here 而导致的问题,您可能会看到同样的情况症状。
如果是这样,问题出在数据的大小 return 此行编辑:
var result = tasks.Select(x => x.Result).ToList();
序列化数据(序列化为 JSON 并作为 UTF-32 数据存储在 Azure 存储中)的大小不得超过 64 KB。如果您删除 return 值或如果您 return 一个较小的值,协调器是否在 600 的情况下完成?
在短期内,我们计划通过在有人尝试 return 从函数中获取过多数据时抛出异常来解决此症状。从长远来看,我们将添加对任意大 return 值的支持。