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 值的支持。