Поделиться через


Сохраняемость и сериализация данных в Устойчивых функциях (Функции Azure)

Среда выполнения Устойчивых функций автоматически сохраняет параметры функций, возвращаемые значения и другие элементы состояния для центра задач, чтобы обеспечить надежное выполнение. Однако объем и частота данных, сохраняемых в долговременном хранилище, может повлиять на производительность приложений и затраты на транзакции хранилища. В зависимости от типа данных, которые хранятся в вашем приложении, также может потребоваться учитывать политики хранения данных и конфиденциальности.

Содержимое центра задач

Центры задач хранят текущее состояние экземпляров и все ожидающие сообщения:

  • Состояния экземпляров хранят текущее состояние и историю экземпляра. Для экземпляров оркестрации это состояние включает состояние среды выполнения, журнал оркестрации, входные данные, выходные данные и настраиваемое состояние. Для экземпляров сущностей указывается состояние сущности.
  • Сообщения хранят входные или выходные данные функции, полезные данные событий и метаданные, которые используются для внутренних целей, таких как маршрутизация и сквозная корреляция.

Сообщения удаляются после обработки, но состояния экземпляра сохраняются, если их не удалит явно приложение или оператор. В частности, журнал оркестрации остается в хранилище даже после завершения оркестрации.

Пример того, как состояния и сообщения представляют ход выполнения оркестрации, см. в примере выполнения центра задач.

Место и способ представления состояний и сообщений в хранилище зависит от поставщика хранилища. Поставщик по умолчанию для Устойчивых функций — это служба хранилища Azure, которая сохраняет данные в очередях, таблицах и блобах в указанной учетной записи службы хранилища Azure.

Типы данных, которые сериализуются и сохраняются

В следующем списке показаны различные типы данных, которые будут сериализованы и сохранены при использовании функций Устойчивые функции:

  • все входящие и выходящие данные функций оркестратора, активности и сущности, включая любые идентификаторы и необработанные исключения;
  • имена функций оркестратора, активности и сущности;
  • Имена внешних событий и полезная нагрузка
  • настраиваемые полезные нагрузки статуса оркестрации
  • Сообщения о завершении оркестрации
  • устойчивые полезные данные таймера;
  • надёжные URL-адреса запросов и ответов HTTP, заголовки и нагрузка.
  • Вызов функции сущности и полезная нагрузка сигнала
  • полезная нагрузка состояния сущности

работа с конфиденциальными данными.

При использовании поставщика хранилищ Azure все данные автоматически шифруются в состоянии покоя. Однако любой пользователь, имеющий доступ к учетной записи хранения, может считывать данные в их незашифрованном виде. Если вам нужна более надежная защита конфиденциальных данных, сначала рассмотрите возможность шифрования данных с помощью собственных ключей шифрования, чтобы данные сохранялись в предварительно зашифрованной форме.

Кроме того, пользователи .NET имеют возможность реализовать пользовательские поставщики сериализации, обеспечивающие автоматическое шифрование. Пример пользовательской сериализации с шифрованием можно найти в этом образце GitHub.

Примечание.

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

Настройка сериализации и десериализации

Логика сериализации по умолчанию

Устойчивые функции для .NET внутри процессов используют JSON.NET для сериализации данных оркестрации и сущностей в JSON. Используются параметры Json.NET по умолчанию:

Входы, выходы и состояние:

JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.None,
    DateParseHandling = DateParseHandling.None,
}

Исключения.

JsonSerializerSettings
{
    ContractResolver = new ExceptionResolver(),
    TypeNameHandling = TypeNameHandling.Objects,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}

Дополнительные сведения о JsonSerializerSettings см. здесь.

Настройка сериализации с помощью атрибутов .NET

Во время сериализации Json.NET ищет различные атрибуты классов и свойств, которые управляют сериализацией и десериализацией данных из JSON. Если вы владеете исходным кодом для типа данных, переданного API-интерфейсам Устойчивых функций, рассмотрите возможность добавления этих атрибутов к типу для настройки сериализации и десериализации.

Кастомизация сериализации с внедрением зависимостей

Приложения-функции, предназначенные для .NET и выполняемые в среде выполнения функции v3, могут использовать внедрение зависимостей (DI) для настройки сериализации данных и исключений. В следующем примере кода показано, как использовать DI для переопределения параметров сериализации Json.NET по умолчанию с помощью пользовательских реализаций интерфейсов служб IMessageSerializerSettingsFactory и IErrorSerializerSettingsFactory.

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;

[assembly: FunctionsStartup(typeof(MyApplication.Startup))]
namespace MyApplication
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IMessageSerializerSettingsFactory, CustomMessageSerializerSettingsFactory>();
            builder.Services.AddSingleton<IErrorSerializerSettingsFactory, CustomErrorSerializerSettingsFactory>();
        }

        /// <summary>
        /// A factory that provides the serialization for all inputs and outputs for activities and
        /// orchestrations, as well as entity state.
        /// </summary>
        internal class CustomMessageSerializerSettingsFactory : IMessageSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }

        /// <summary>
        /// A factory that provides the serialization for all exceptions thrown by activities
        /// and orchestrations
        /// </summary>
        internal class CustomErrorSerializerSettingsFactory : IErrorSerializerSettingsFactory
        {
            public JsonSerializerSettings CreateJsonSerializerSettings()
            {
                // Return your custom JsonSerializerSettings here
            }
        }
    }
}