Trwałość i serializacja danych w Durable Functions (Azure Functions)

Środowisko uruchomieniowe Durable Functions automatycznie utrwala parametry funkcji, zwraca wartości i inny stan do centrum zadań w celu zapewnienia niezawodnego wykonywania. Jednak ilość i częstotliwość danych utrwalone w magazynie trwałym mogą mieć wpływ na wydajność aplikacji i koszty transakcji magazynu. W zależności od typu danych przechowywanych przez aplikację należy również rozważyć przechowywanie danych i zasady ochrony prywatności.

Zawartość centrum zadań

Centra zadań przechowują bieżący stan wystąpień i wszystkie oczekujące komunikaty:

  • Stany wystąpienia przechowują bieżący stan i historię wystąpienia. W przypadku wystąpień orkiestracji ten stan obejmuje stan środowiska uruchomieniowego, historię aranżacji, dane wejściowe, dane wyjściowe i stan niestandardowy. W przypadku wystąpień jednostek zawiera stan jednostki.
  • Komunikaty przechowują dane wejściowe lub wyjściowe funkcji, ładunki zdarzeń i metadane używane do celów wewnętrznych, takie jak routing i kompleksowa korelacja.

Komunikaty są usuwane po przetworzeniu, ale stany wystąpień są utrwalane, chyba że zostaną jawnie usunięte przez aplikację lub operator. W szczególności historia aranżacji pozostaje w magazynie nawet po zakończeniu aranżacji.

Przykład sposobu, w jaki stany i komunikaty reprezentują postęp aranżacji, zobacz przykład wykonywania centrum zadań.

Gdzie i jak stany i komunikaty są reprezentowane w magazynie , zależy od dostawcy magazynu. domyślnym dostawcą Durable Functions jest usługa Azure Storage, która przechowuje dane w kolejkach, tabelach i obiektach blob na określonym koncie usługi Azure Storage.

Typy danych, które są serializowane i utrwalane

Na poniższej liście przedstawiono różne typy danych, które będą serializowane i utrwalane podczas korzystania z funkcji Durable Functions:

  • Wszystkie dane wejściowe i wyjściowe funkcji orkiestratora, działania i jednostki, w tym wszelkie identyfikatory i nieobsługiwane wyjątki
  • Nazwy funkcji orkiestratora, działania i jednostki
  • Nazwy i ładunki zdarzeń zewnętrznych
  • Niestandardowe ładunki stanu orkiestracji
  • Komunikaty o zakończeniu orkiestracji
  • Trwałe ładunki czasomierza
  • Trwałe adresy URL żądań HTTP i odpowiedzi, nagłówki i ładunki
  • Ładunek wywołania jednostki i sygnału
  • Ładunki stanu jednostki

Praca z poufnymi danymi

W przypadku korzystania z dostawcy usługi Azure Storage wszystkie dane są automatycznie szyfrowane podczas magazynowania. Jednak każda osoba mająca dostęp do konta magazynu może odczytać dane w postaci niezaszyfrowanej. Jeśli potrzebujesz silniejszej ochrony poufnych danych, rozważ najpierw zaszyfrowanie danych przy użyciu własnych kluczy szyfrowania, aby dane zostały utrwalone w postaci wstępnie zaszyfrowanej.

Alternatywnie użytkownicy platformy .NET mają możliwość zaimplementowania niestandardowych dostawców serializacji, którzy zapewniają automatyczne szyfrowanie. Przykład niestandardowej serializacji z szyfrowaniem można znaleźć w tym przykładzie usługi GitHub.

Uwaga

Jeśli zdecydujesz się wdrożyć szyfrowanie na poziomie aplikacji, pamiętaj, że aranżacje i jednostki mogą istnieć przez czas nieokreślony. Ma to znaczenie w przypadku rotacji kluczy szyfrowania, ponieważ orkiestracja lub jednostki mogą działać dłużej niż zasady rotacji kluczy. Jeśli nastąpi rotacja kluczy, klucz używany do szyfrowania danych może nie być już dostępny do odszyfrowania ich przy następnym wykonaniu aranżacji lub jednostki. Dlatego szyfrowanie klienta jest zalecane tylko wtedy, gdy aranżacje i jednostki powinny być uruchamiane przez stosunkowo krótki czas.

Dostosowywanie serializacji i deserializacji

Domyślna logika serializacji

Durable Functions dla platformy .NET w procesie wewnętrznym używa Json.NET do serializacji aranżacji i danych jednostki w formacie JSON. Używane są domyślne ustawienia Json.NET:

Dane wejściowe, dane wyjściowe i stan:

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

Wyjątki:

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

Przeczytaj bardziej szczegółową dokumentację na ten temat JsonSerializerSettingstutaj.

Dostosowywanie serializacji przy użyciu atrybutów platformy .NET

Podczas serializacji Json.NET wyszukuje różne atrybuty klas i właściwości, które kontrolują sposób serializacji i deserializacji danych z formatu JSON. Jeśli jesteś właścicielem kodu źródłowego dla typu danych przekazanego do interfejsów API Durable Functions, rozważ dodanie tych atrybutów do typu w celu dostosowania serializacji i deserializacji.

Dostosowywanie serializacji za pomocą wstrzykiwania zależności

Aplikacje funkcji przeznaczone dla platformy .NET i uruchamiane w środowisku uruchomieniowym usługi Functions w wersji 3 mogą używać wstrzykiwania zależności (DI), aby dostosować sposób serializacji danych i wyjątków. Poniższy przykładowy kod pokazuje, jak za pomocą di zastąpić domyślne ustawienia serializacji Json.NET przy użyciu niestandardowych implementacji interfejsów IMessageSerializerSettingsFactory usług i 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
            }
        }
    }
}