【问题标题】:How to multi-thread big data in the Orchestrator?如何在 Orchestrator 中对大数据进行多线程处理?
【发布时间】:2020-04-25 05:13:26
【问题描述】:

我在 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 条记录),并且由于 CallActivityAsync 无法返回超过 8mb 的数据,Orchestrator 无法继续。

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

我这样做是为了让 Azure 使用多个线程写入 ADL。一开始我尝试使用信号量,网上的多个消息来源告诉我,不应使用信号量,而应使用“CallActivityAsync”,这将允许 Azure 管理自己的线程。

如何解决这个问题并实现多线程写入ADL?

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

【问题讨论】:

  • 在我看来,您的 GetRecords 应该以块的形式返回数据
  • 不确定 azure 函数是否适合您的要求。有什么功能呢?其他服务可以更高效地传输大量数据。

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


【解决方案1】:

GetRecordsWriteRecord 是否有理由使用 Durable 功能设置?如果没有,GetRecords 可以将每个 Record 对象(序列化为 JSON)拖放到 Azure Queue/EventHub,而不是返回一个巨大的列表。然后可以从该队列/EventHub 触发WriteRecords 来处理每条消息。

【讨论】:

  • 这是我要采取的方法。听起来很合理,应该可行。
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多