如何在Orchestrator中对大数据进行多线程处理?

时间:2020-01-07 16:53:16

标签: c# azure azure-functions orchestration azure-durable-functions

我在Orchestrator中有以下代码:

        var parallelTasks = new List<Task>();

        // Get Records
        List<Record> records = await context.CallActivityAsync<List<Record>>("GetRecords", orchestrationContext);

        // Write Records
        foreach (Record record in records)
        {
            parallelTasks.Add(context.CallActivityAsync<int>("WriteRecord", record));
        }

        await Task.WhenAll(parallelTasks);

此操作失败,因为GetRecords返回的数据过多(60000条记录),并且Orchestrator无法继续执行,因为CallActivityAsync不能返回超过8mb的数据。

这也可能会失败,因为它实际上将尝试为每次写入启动60000个活动。

我正在这样做,因此Azure将使用多个线程写入ADL。最初,我尝试使用Semaphores,并且在线上有多个来源告诉我,不应使用Sempahores,而应使用“ CallActivityAsync”,这将允许Azure管理其自己的线程。

如何解决此问题并实现对ADL的多线程写入?

出于记录目的,我使用的库一次只能写入一个文件(我知道MS的新库包含批量写入,但是由于不同的原因我无法使用它)。

1 个答案:

答案 0 :(得分:1)

是否有GetRecordsWriteRecord处于持久功能设置的原因?如果没有,GetRecords可以将每个Record对象(序列化为JSON)放置到Azure Queue / EventHub中,而不是返回庞大的列表。然后可以从该Queue / EventHub触发WriteRecords来处理每条消息。