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


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