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