我在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的新库包含批量写入,但是由于不同的原因我无法使用它)。
答案 0 :(得分:1)
是否有GetRecords
和WriteRecord
处于持久功能设置的原因?如果没有,GetRecords
可以将每个Record
对象(序列化为JSON)放置到Azure Queue / EventHub中,而不是返回庞大的列表。然后可以从该Queue / EventHub触发WriteRecords
来处理每条消息。