Azure долговременная функция с триггером Event Grid в оркестровочном клиенте пропускает обработку некоторых событий - PullRequest
0 голосов
/ 13 апреля 2020

Я создал долговременное функциональное приложение с несколькими функциями активности, которые выполняют некоторую обработку файлов PDF. Я хочу, чтобы приложение запускалось при отправке события в сетку событий topi c, в котором содержится путь к файлу PDF в Azure хранилище. В настоящее время я использую Премиум план для функционального приложения. Эта проблема возникает, когда я пытаюсь выполнить одновременную обработку нескольких больших файлов PDF (более 100 МБ). Если я публикую два события одновременно, обрабатывается только один из файлов. Кажется, что из-за внезапной загрузки приложения функции функция активности завершается сбоем в одном процессе, который, в любом случае, следует повторить, поскольку при вызове функции действия я использую context.CallActivityWithRetryAsync.

Забавно, что эта проблема вообще не возникает, когда я использую триггер HTTP в клиенте оркестровки. В этом случае приложение-функция работает отлично.

Вот моя функция, запускаемая сеткой событий:

public class ProcessJobEventGrid
{
    [FunctionName("ProcessJob_EventGrid")]
    public static async void EventGridTest([EventGridTrigger]EventGridEvent eventGridEvent, [DurableClient] IDurableOrchestrationClient starter, ILogger log)
    {
        JObject objData = JObject.Parse(eventGridEvent.Data.ToString());

        // Function input comes from the request content.
        string instanceId = await starter.StartNewAsync("ProcessJob_Orchestrator", null, JsonConvert.SerializeObject(objData));

        log.LogInformation(eventGridEvent.Data.ToString());
    }
}

Вот функция, запускаемая по HTTP:

public class ProcessJobHttpStart
{
    [FunctionName("ProcessJob_HttpStart")]
    public static async Task<HttpResponseMessage> HttpStart([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req, [DurableClient] IDurableOrchestrationClient starter, ILogger log)
    {
        string sJsonInput = await req.Content.ReadAsStringAsync();
        JObject jObject = JObject.Parse(sJsonInput);

        // Function input comes from the request content.
        string instanceId = await starter.StartNewAsync("ProcessJob_Orchestrator", null, JsonConvert.SerializeObject(jObject));

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...