C# 如何在Orchestrator中处理多线程大数据?
我在编排器中有以下代码:C# 如何在Orchestrator中处理多线程大数据?,c#,azure,azure-functions,orchestration,azure-durable-functions,C#,Azure,Azure Functions,Orchestration,Azure Durable Functions,我在编排器中有以下代码: var parallelTasks = new List<Task>(); // Get Records List<Record> records = await context.CallActivityAsync<List<Record>>("GetRecords", orchestrationContext); // Write Records
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写入。起初我尝试使用信号量,多个在线来源告诉我不应该使用Sempahores,而应该使用CallActivityAsync,这将允许Azure管理自己的线程
如何解决这个问题并实现对ADL的多线程写入
对于记录,我使用的库一次只能写入一个文件,我知道MS的新库包含批量写入,但由于不同的原因,我无法使用该库。GetRecords和WriterRecord是否有理由处于持久功能设置中?否则,GetRecords可以将序列化为JSON的每个记录对象放到Azure队列/EventHub中,而不是返回一个巨大的列表。然后可以从该队列/EventHub触发WriterRecords来处理每条消息。在我看来,您的GetRecords应该以块的形式返回数据。不确定azure功能是否适合您的要求。函数的作用是什么?其他服务可以更高效地传输大量数据。这是我将要采取的方法。听起来很合理,应该有用。