Я создал долговременное функциональное приложение с несколькими функциями активности, которые выполняют некоторую обработку файлов 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);
}
}