Share via


Gegevenspersistentie en serialisatie in Durable Functions (Azure Functions)

De Durable Functions-runtime bewaart automatisch functieparameters, retourwaarden en andere statussen aan de taakhub om betrouwbare uitvoering te bieden. De hoeveelheid en frequentie van gegevens die worden bewaard in duurzame opslag, kunnen echter van invloed zijn op de prestaties van toepassingen en de opslagtransactiekosten. Afhankelijk van het type gegevens dat uw toepassing opslaat, moet mogelijk ook rekening worden gehouden met gegevensretentie en privacybeleid.

Inhoud van Taakhub

Taakhubs slaan de huidige status van exemplaren en eventuele in behandeling zijnde berichten op:

  • Instantiestatussen slaan de huidige status en geschiedenis van een exemplaar op. Voor indelingsexemplaren omvat deze status de runtimestatus, de indelingsgeschiedenis, invoer, uitvoer en aangepaste status. Voor entiteitsexemplaren bevat deze de entiteitsstatus.
  • Berichten slaan functie-invoer of -uitvoer, nettoladingen van gebeurtenissen en metagegevens op die worden gebruikt voor interne doeleinden, zoals routering en end-to-end correlatie.

Berichten worden verwijderd nadat ze zijn verwerkt, maar exemplaarstatussen blijven behouden, tenzij ze expliciet door de toepassing of een operator worden verwijderd. In het bijzonder blijft een indelingsgeschiedenis in de opslag, zelfs nadat de indeling is voltooid.

Zie het voorbeeld van de uitvoering van de taakhub voor een voorbeeld van hoe statussen en berichten de voortgang van een indeling vertegenwoordigen.

Waar en hoe statussen en berichten worden weergegeven in de opslag , is afhankelijk van de opslagprovider. De standaardprovider van Durable Functions is Azure Storage, waarmee gegevens worden bewaard in wachtrijen, tabellen en blobs in een Azure Storage-account dat u opgeeft.

Typen gegevens die worden geserialiseerd en persistent

In de volgende lijst ziet u de verschillende typen gegevens die worden geserialiseerd en behouden wanneer u functies van Durable Functions gebruikt:

  • Alle invoer en uitvoer van orchestrator-, activiteits- en entiteitsfuncties, inclusief id's en niet-verwerkte uitzonderingen
  • Namen van orchestrator-, activiteits- en entiteitsfuncties
  • Namen en nettoladingen van externe gebeurtenissen
  • Nettoladingen van aangepaste indelingsstatus
  • Beëindigingsberichten voor indeling
  • Duurzame timerpayloads
  • Duurzame HTTP-aanvraag- en antwoord-URL's, headers en nettoladingen
  • Nettoladingen voor entiteitsoproepen en -signaal
  • Nettoladingen van entiteitsstatus

Werken met gevoelige gegevens

Wanneer u de Azure Storage-provider gebruikt, worden alle gegevens automatisch in rust versleuteld. Iedereen met toegang tot het opslagaccount kan de gegevens echter lezen in de niet-versleutelde vorm. Als u een sterkere beveiliging voor gevoelige gegevens nodig hebt, kunt u overwegen eerst de gegevens te versleutelen met uw eigen versleutelingssleutels, zodat de gegevens in de vooraf versleutelde vorm behouden blijven.

U kunt ook .NET-gebruikers gebruiken om aangepaste serialisatieproviders te implementeren die automatische versleuteling bieden. Een voorbeeld van aangepaste serialisatie met versleuteling vindt u in dit GitHub-voorbeeld.

Notitie

Als u besluit om versleuteling op toepassingsniveau te implementeren, moet u er rekening mee houden dat indelingen en entiteiten voor onbepaalde tijd kunnen bestaan. Dit is belangrijk wanneer het tijd is om uw versleutelingssleutels te roteren, omdat een indeling of entiteiten langer kunnen worden uitgevoerd dan uw sleutelrotatiebeleid. Als er een sleutelrotatie plaatsvindt, is de sleutel die wordt gebruikt om uw gegevens te versleutelen mogelijk niet meer beschikbaar om deze te ontsleutelen wanneer uw indeling of entiteit de volgende keer wordt uitgevoerd. Klantversleuteling wordt daarom alleen aanbevolen wanneer indelingen en entiteiten naar verwachting gedurende relatief korte tijd worden uitgevoerd.

Serialisatie en deserialisatie aanpassen

Standaardserialisatielogica

Durable Functions voor .NET wordt intern gebruikt Json.NET voor het serialiseren van indelings- en entiteitsgegevens naar JSON. De standaardinstellingen die worden gebruikt Json.NET zijn:

Invoer, uitvoer en status:

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

Uitzonderingen:

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

Lees hier meer gedetailleerde documentatie.JsonSerializerSettings

Serialisatie aanpassen met .NET-kenmerken

Tijdens serialisatie zoekt Json.NET naar verschillende kenmerken op klassen en eigenschappen die bepalen hoe de gegevens worden geserialiseerd en gedeserialiseerd vanuit JSON. Als u eigenaar bent van de broncode voor het gegevenstype dat wordt doorgegeven aan Durable Functions-API's, kunt u deze kenmerken toevoegen aan het type om serialisatie en deserialisatie aan te passen.

Serialisatie aanpassen met afhankelijkheidsinjectie

Functie-apps die zijn gericht op .NET en worden uitgevoerd op de Functions V3-runtime, kunnen afhankelijkheidsinjectie (DI) gebruiken om aan te passen hoe gegevens en uitzonderingen worden geserialiseerd. De volgende voorbeeldcode laat zien hoe u DI gebruikt om de standaardinstellingen voor Json.NET serialisatie te overschrijven met behulp van aangepaste implementaties van de IMessageSerializerSettingsFactory en IErrorSerializerSettingsFactory service-interfaces.

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