Sdílet prostřednictvím


Trvalost a serializace dat v Durable Functions (Azure Functions)

Modul runtime Durable Functions automaticky zachovává parametry funkce, návratové hodnoty a další stav do centra úloh za účelem zajištění spolehlivého spuštění. Množství a frekvence dat uchováných v trvalém úložišti ale může mít vliv na výkon aplikace a náklady na transakce úložiště. V závislosti na typu dat, která vaše aplikace ukládá, může být potřeba zvážit také zásady uchovávání dat a ochrany osobních údajů.

Obsah centra úloh

Centra úloh ukládají aktuální stav instancí a všechny čekající zprávy:

  • Stavy instancí ukládají aktuální stav a historii instance. Pro instance orchestrace tento stav zahrnuje stav modulu runtime, historii orchestrace, vstupy, výstupy a vlastní stav. V případě instancí entit zahrnuje stav entity.
  • Zprávy ukládají vstupy nebo výstupy funkcí, datové části událostí a metadata, která se používají pro interní účely, jako je směrování a kompletní korelace.

Zprávy se po zpracování odstraní, ale stavy instancí se zachovají, pokud je aplikace nebo operátor explicitně nesmažou. Zejména historie orchestrace zůstává v úložišti i po dokončení orchestrace.

Příklad toho, jak stavy a zprávy představují průběh orchestrace, najdete v příkladu spuštění centra úloh.

Kde a jak jsou stavy a zprávy reprezentovány v úložišti , závisí na poskytovateli úložiště. Výchozí zprostředkovatel Durable Functions je Azure Storage, který zachovává data ve frontách, tabulkách a objektech blob v zadaném účtu azure Storage .

Typy dat serializovaných a trvalých

Následující seznam ukazuje různé typy dat, které budou serializovány a zachovány při použití funkcí Durable Functions:

  • Všechny vstupy a výstupy funkcí orchestrátoru, aktivity a entit, včetně všech ID a neošetřených výjimek
  • Názvy funkcí orchestratoru, aktivit a entit
  • Názvy a datové části externích událostí
  • Vlastní datová část stavu orchestrace
  • Zprávy o ukončení orchestrace
  • Datové části trvalých časovačů
  • Trvalé adresy URL požadavků a odpovědí HTTP, hlavičky a datové části
  • Datové části volání entity a signálu
  • Datové části stavu entity

Práce s citlivými daty

Při použití poskytovatele služby Azure Storage se všechna neaktivní uložená data automaticky šifrují. Každý, kdo má přístup k účtu úložiště, ale může číst data v nezašifrované podobě. Pokud potřebujete silnější ochranu citlivých dat, zvažte nejprve šifrování dat pomocí vlastních šifrovacích klíčů, aby se data zachovala v předšifrované podobě.

Alternativně mají uživatelé .NET možnost implementace vlastních zprostředkovatelů serializace, které poskytují automatické šifrování. Příklad vlastní serializace s šifrováním najdete v této ukázce GitHubu.

Poznámka:

Pokud se rozhodnete implementovat šifrování na úrovni aplikace, mějte na paměti, že orchestrace a entity mohou existovat po neomezenou dobu. Záleží na tom, když přijde čas na obměně šifrovacích klíčů, protože orchestrace nebo entity můžou běžet déle než zásady obměna klíčů. Pokud k obměně klíčů dojde, klíč použitý k šifrování dat už nemusí být k dispozici k jeho dešifrování při příštím spuštění orchestrace nebo entity. Šifrování zákazníka se proto doporučuje jenom v případě, že se očekává, že se orchestrace a entity budou spouštět po relativně krátkou dobu.

Přizpůsobení serializace a deserializace

Výchozí logika serializace

Durable Functions pro .NET interně používá Json.NET k serializaci orchestrace a dat entity do formátu JSON. Výchozí Json.NET nastavení jsou:

Vstupy, výstupy a stav:

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

Výjimky:

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

Podrobnější dokumentaci JsonSerializerSettings najdete tady.

Přizpůsobení serializace pomocí atributů .NET

Během serializace Json.NET hledá různé atributy tříd a vlastností, které řídí, jak jsou data serializována a deserializována z JSON. Pokud vlastníte zdrojový kód pro datový typ předaný rozhraním API Durable Functions, zvažte přidání těchto atributů do typu pro přizpůsobení serializace a deserializace.

Přizpůsobení serializace pomocí injektáže závislostí

Aplikace funkcí, které cílí na .NET a běží v modulu runtime Functions V3, můžou pomocí injektáže závislostí (DI) přizpůsobit způsob serializace dat a výjimek. Následující ukázkový kód ukazuje, jak pomocí DI přepsat výchozí Json.NET serializace nastavení pomocí vlastních implementací IMessageSerializerSettingsFactory rozhraní a IErrorSerializerSettingsFactory služeb.

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
            }
        }
    }
}