Azure Функции: как управлять долговременными функциями с помощью триггеров Blob? - PullRequest
1 голос
/ 31 марта 2020

Представьте, что у меня есть учетная запись хранения с контейнером 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, чтобы он генерировался случайным образом и никогда не конфликтовал с уже запущенным. Но безопасно ли это делать? Как мне управлять ими и обеспечить, чтобы они когда-нибудь закончили?

1 Ответ

1 голос
/ 01 апреля 2020
string instanceId = await starter.StartNewAsync("PayrollFile_StartFunction", "payroll_file", name);

Второй аргумент - это instanceId, который должен быть уникальным .

Вместо этого попробуйте:

string instanceId = await starter.StartNewAsync("PayrollFile_StartFunction", input: name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...