Устойчивые функции Azure: проблема с большими сообщениями - PullRequest
1 голос
/ 06 марта 2019

У меня проблема с возвратом большого списка объектов из функции действия в функцию оркестратора. У меня есть функция, которая загружает файл 180 МБ и анализирует его. Этот файл создаст список объектов с более чем 962K записей. Каждый объект имеет около 70 свойств, но только около 20% из них заселены. Когда я запускаю функцию, код успешно загружает и анализирует файл в списке, но когда список возвращается, возникает исключение со следующей информацией:

Исключение: "Исключение при выполнении функции: #######" - Источник: "System.Private.CoreLib"

Внутреннее исключение: «Ошибка при обработке параметра $ return после возврата функции». - Источник: "Microsoft.Azure.WebJobs.Host"

Внутреннее / внутреннее исключение: «Исключение типа« System.OutOfMemoryException »было сгенерировано». - Источник: "System.Private.CoreLib"

Последнее вложенное исключение перечисляет пакет NewtonsoftJson как тот, который выполняет вызов, который генерирует сообщение об ошибке нехватки памяти. Я включаю полную трассировку стека для этого исключения в конце.

Я понимаю, что мог бы сериализовать список объектов и сохранить их в записи BLOB-объекта Azure, а затем просто снова взять его в следующей функции, которая должна его обработать, но я думал, что идея долгосрочных функций заключается в том, чтобы избежать все это и поддерживать стройный рабочий процесс? Кроме того, я основал дизайн на публикации Github «Large Message Support # 26», в которой говорится, что расширения долговременных функций автоматически сохранят полезную нагрузку функции в BLOB-объекте, если размер превысит предел сообщения в очереди (см .: https://github.com/Azure/azure-functions-durable-extension/issues/26).

Что-нибудь нужно сделать, чтобы это заработало? Код довольно прост:

[FunctionName("GetDataFromSource")]
public static IEnumerable<DataDetail> GetDataFromSource([ActivityTrigger]ISource source, ILogger logger)
{
    try
    {
        string importSettings = Environment.GetEnvironmentVariable(source.SettingsKey);
        if (string.IsNullOrWhiteSpace(importSettings))
        {
            logger.LogError($"No settings key information found for the {source.SourceId} data source");                    }
        else
        {
            List<DataDetail> _Data = source.GetVinData().Distinct().ToList();
            return vinData;
         }
     }
     catch (Exception ex)
     {
         logger.LogCritical($"Error processing the {source.SourceId} Vin data source. *** Exception: {ex}");
     }

      return new List<DataDetail>();
}

Это трассировка стека для самого внутреннего исключения:

at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
   at System.Text.StringBuilder.Append(Char value, Int32 repeatCount)
   at System.Text.StringBuilder.Append(Char value)
   at System.IO.StringWriter.Write(Char value)
   at Newtonsoft.Json.JsonTextWriter.WritePropertyName(String name, Boolean escape)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at DurableTask.Core.Serializing.JsonDataConverter.Serialize(Object value, Boolean formatted)
   at Microsoft.Azure.WebJobs.Extensions.DurableTask.MessagePayloadDataConverter.Serialize(Object value, Int32 maxSizeInKB) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\MessagePayloadDataConverter.cs:line 55
   at Microsoft.Azure.WebJobs.Extensions.DurableTask.MessagePayloadDataConverter.Serialize(Object value) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\MessagePayloadDataConverter.cs:line 43
   at Microsoft.Azure.WebJobs.DurableActivityContext.SetOutput(Object output) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\DurableActivityContext.cs:line 136
   at Microsoft.Azure.WebJobs.Extensions.DurableTask.ActivityTriggerAttributeBindingProvider.ActivityTriggerBinding.ActivityTriggerReturnValueBinder.SetValueAsync(Object value, CancellationToken cancellationToken) in C:\projects\azure-functions-durable-extension\src\WebJobs.Extensions.DurableTask\Bindings\ActivityTriggerAttributeBindingProvider.cs:line 213
   at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ParameterHelper.ProcessOutputParameters(CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 972
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...