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


Сохраняемость и сериализация данных в Устойчивых функциях (Функции 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) для настройки сериализации данных и исключений. В следующем примере кода показано, как использовать внедрение зависимостей для переопределения параметров сериализации по умолчанию 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
            }
        }
    }
}