Представьте, что у меня есть учетная запись хранения с контейнером BLOB-объектов, которые в конечном итоге загружают файлы. Я хочу обработать каждый файл, который попадает в хранилище BLOB-объектов, открыть его, извлечь и сохранить информацию. Определенно дорогая операция, которая может вписаться в сценарий Durable Functions.
Вот триггер:
[FunctionName("PayrollFileTrigger")]
public static async Task Start(
[BlobTrigger("files/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync("PayrollFile_StartFunction", "payroll_file", name);
}
... который вызывает оркестровку:
[FunctionName("PayrollFile_StartFunction")]
public async static Task<IActionResult> Run(
[OrchestrationTrigger] IDurableOrchestrationContext context, string blobName,
ExecutionContext executionContext, ILogger log)
{
//Downloads the blob
string filePath =
await context.CallActivityWithRetryAsync<string>("DownloadPayrollBlob", options, blobName);
if (filePath == null) return ErrorResult(ERROR_MSG_1, log);
//Extract data
var payroll =
await context.CallActivityWithRetryAsync<Payroll>("ExtractBlobData", options, filePath);
... and so on (just a sample here) ...
}
Но существует проблема. Во время тестирования возникает эта ошибка, что, я думаю, означает, что я не могу запустить другую оркестровку с тем же идентификатором:
An Orchestration instance with the status Pending already exists.
1 - поэтому, если я отправлю sh много файлов в контейнер, который триггер «прослушивает», за короткий промежуток времени оркестровка будет занята одним из них и будет игнорировать другой в дальнейшем. Мероприятия?
2 - Когда оркестровка избавится от статуса pending
? Это происходит автоматически?
3 - Должен ли я создавать новый экземпляр оркестровки для каждого файла, который будет обработан? Я знаю, что вы можете опустить параметр instanceId
, чтобы он генерировался случайным образом и никогда не конфликтовал с уже запущенным. Но безопасно ли это делать? Как мне управлять ими и обеспечить, чтобы они когда-нибудь закончили?