Udostępnij za pośrednictwem


Trwałość danych i serializacja w usłudze 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ę konieczne może być również rozważenie przechowywania danych i zasad 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ń jednostki 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.

Aby zapoznać się z przykładem tego, jak stany i komunikaty reprezentują postęp orkiestracji, zobacz przykład wykonywania centrum zadań.

Gdzie i jak stany i komunikaty są reprezentowane w magazynie , zależy od dostawcy magazynu. Domyślnym dostawcą usługi Durable Functions jest usługa Azure Storage, która utrwala 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 rozszerzenia 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 zakończenia orkiestracji
  • Trwałe ładunki czasomierza
  • Trwałe żądania HTTP i adresy URL odpowiedzi, nagłówki i ładunki
  • Wywołanie jednostki i ładunki sygnału
  • Ładunki stanu jednostki

Praca z danymi poufnymi

W przypadku korzystania z dostawcy usługi Azure Storage wszystkie dane są automatycznie szyfrowane w spoczynku. Jednak każda osoba mająca dostęp do konta magazynu może odczytywać dane w postaci niezaszyfrowanej. Jeśli potrzebujesz silniejszej ochrony danych poufnych, rozważ najpierw szyfrowanie 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ść implementowania niestandardowych dostawców serializacji, którzy zapewniają automatyczne szyfrowanie. Przykład serializacji niestandardowej 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 nieokreślony czas. 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 odszyfrowywania go 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

Rozszerzenie 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 domyślne ustawienia Json.NET to:

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 JsonSerializerSettings tutaj.

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

Podczas serializacji Json.NET szuka różnych atrybutów 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 funkcji 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
            }
        }
    }
}