Datapersistence och serialisering i Durable Functions (Azure Functions)
Durable Functions-körningen bevarar automatiskt funktionsparametrar, returvärden och annat tillstånd till aktivitetshubben för att tillhandahålla tillförlitlig körning. Mängden och frekvensen för data som sparas till varaktig lagring kan dock påverka programprestanda och kostnader för lagringstransaktioner. Beroende på vilken typ av data som ditt program lagrar kan även datakvarhållnings- och sekretesspolicyer behöva beaktas.
Innehåll i aktivitetshubben
Uppgiftshubbar lagrar det aktuella tillståndet för instanser och eventuella väntande meddelanden:
- Instanstillstånd lagrar den aktuella statusen och historiken för en instans. För orkestreringsinstanser omfattar det här tillståndet körningstillstånd, orkestreringshistorik, indata, utdata och anpassad status. För entitetsinstanser innehåller den entitetstillståndet.
- Meddelanden lagrar funktionsindata eller utdata, händelsenyttolaster och metadata som används för interna ändamål, till exempel routning och korrelation från slutpunkt till slutpunkt.
Meddelanden tas bort när de har bearbetats, men instanstillstånden kvarstår om de inte uttryckligen tas bort av programmet eller en operatör. I synnerhet finns en orkestreringshistorik kvar i lagringen även efter att orkestreringen har slutförts.
Ett exempel på hur tillstånd och meddelanden representerar förloppet för en orkestrering finns i körningsexemplet för aktivitetshubben.
Var och hur tillstånd och meddelanden representeras i lagringen beror på lagringsprovidern. Durable Functions standardprovider är Azure Storage, som lagrar data till köer, tabeller och blobar i ett Azure Storage-konto som du anger.
Typer av data som serialiseras och bevaras
I följande lista visas de olika typer av data som kommer att serialiseras och sparas när du använder funktioner i Durable Functions:
- Alla indata och utdata från orkestrerings-, aktivitets- och entitetsfunktioner, inklusive eventuella ID:n och ohanterade undantag
- Orkestrerings-, aktivitets- och entitetsfunktionsnamn
- Namn och nyttolaster för externa händelser
- Nyttolaster för anpassad orkestreringsstatus
- Meddelanden om orkestreringsavslut
- Varaktiga tidsinställda nyttolaster
- Varaktiga URL:er för HTTP-begäranden och svar, huvuden och nyttolaster
- Entitetsanrop och signalnyttolaster
- Nyttolaster för entitetstillstånd
Arbeta med känsliga data
När du använder Azure Storage-providern krypteras alla data automatiskt i vila. Alla som har åtkomst till lagringskontot kan dock läsa data i sitt okrypterade formulär. Om du behöver ett starkare skydd för känsliga data bör du först kryptera data med dina egna krypteringsnycklar så att data sparas i förkrypterat format.
Alternativt har .NET-användare möjlighet att implementera anpassade serialiseringsproviders som tillhandahåller automatisk kryptering. Ett exempel på anpassad serialisering med kryptering finns i det här GitHub-exemplet.
Kommentar
Om du bestämmer dig för att implementera kryptering på programnivå bör du vara medveten om att orkestreringar och entiteter kan finnas på obestämd tid. Det här är viktigt när det är dags att rotera krypteringsnycklarna eftersom en orkestrering eller entiteter kan köras längre än din nyckelroteringsprincip. Om en nyckelrotation sker kanske nyckeln som används för att kryptera dina data inte längre är tillgänglig för att dekryptera dem nästa gång orkestreringen eller entiteten körs. Kundkryptering rekommenderas därför endast när orkestreringar och entiteter förväntas köras under relativt korta tidsperioder.
Anpassa serialisering och deserialisering
Standardlogik för serialisering
Durable Functions för .NET använder internt Json.NET för att serialisera orkestrerings- och entitetsdata till JSON. Standardinställningarna för Json.NET används:
Indata, utdata och tillstånd:
JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.None,
DateParseHandling = DateParseHandling.None,
}
Undantag:
JsonSerializerSettings
{
ContractResolver = new ExceptionResolver(),
TypeNameHandling = TypeNameHandling.Objects,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}
Läs mer detaljerad dokumentation om JsonSerializerSettings
här.
Anpassa serialisering med .NET-attribut
Under serialiseringen letar Json.NET efter olika attribut på klasser och egenskaper som styr hur data serialiseras och deserialiseras från JSON. Om du äger källkoden för datatypen som skickas till Durable Functions-API:er kan du överväga att lägga till dessa attribut i typen för att anpassa serialisering och deserialisering.
Anpassa serialisering med beroendeinmatning
Funktionsappar som riktar in sig på .NET och körs på Functions V3-körningen kan använda beroendeinmatning (DI) för att anpassa hur data och undantag serialiseras. Följande exempelkod visar hur du använder DI för att åsidosätta standardinställningarna för Json.NET serialisering med anpassade implementeringar av IMessageSerializerSettingsFactory
IErrorSerializerSettingsFactory
och tjänstgränssnitt.
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
}
}
}
}