Azure持久功能 - 即使在完成所有任务后状态仍在运行

时间:2017-11-21 14:34:27

标签: azure-functions azure-table-storage

与我之前的问题相关 - link

我已经使用HttpStart创建了一个Durable作业,以便通过http请求(来自MSDN的示例代码中的代码)调用它。

在我的Durable作业中,我编写逻辑循环并调用活动触发器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;     
}

activitytrigger只是延迟10毫秒,然后返回对象。

[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个业务验证规则。

工作状态总是回归&#34;运行&#34;当我用600循环执行上述功能时。如果将循环计数更改为500,则其工作没有任何问题并返回结果。我在本地计算机和Azure上测试了这个。它在两种环境中都是一样的。但是,在我的本地计算机中,我发现作业已完成,我可以在return result;的Durablefunction中获得调试点,但状态始终显示为&#34;正在运行&#34;。

看起来Durable函数完成了这项工作,但由于某种原因,数据没有登录到Azure存储表,因此状态仍在运行。

请告知。

1 个答案:

答案 0 :(得分:1)

鉴于它适用于较小的数字而不是较大的数字,我的猜测是您遇到了由于缺少support for large messages而导致的问题。另一位用户打开了类似的问题here,您可能会看到相同的症状。

如果是这样,问题是此行返回的数据大小:

var result = tasks.Select(x => x.Result).ToList();

序列化数据(序列化为JSON并在Azure存储中存储为UTF-32数据)的大小不得超过64 KB。如果删除返回值或返回较小的值,那么协调器是否在600案例中完成?

在短期内,我们计划通过在有人试图从函数返回过多数据时抛出异常来解决症状。从长远来看,我们会增加对任意大回报值的支持。