Megosztás a következőn keresztül:


Adatmegőrzés és szerializálás a Durable Functionsben (Azure Functions)

A Durable Functions futtatókörnyezete automatikusan megőrzi a függvényparamétereket, visszaadja az értékeket és az egyéb állapotokat a feladatközpontban a megbízható végrehajtás érdekében. A tartós tárolásban tárolt adatok mennyisége és gyakorisága azonban hatással lehet az alkalmazások teljesítményére és a tárolási tranzakciók költségeire. Az alkalmazás által tárolt adatok típusától függően az adatmegőrzési és adatvédelmi szabályzatokat is figyelembe kell venni.

Tevékenységközpont tartalma

A feladatközpontok a példányok aktuális állapotát és a függőben lévő üzeneteket tárolják:

  • A példányállapotok egy példány aktuális állapotát és előzményeit tárolják. Vezénylési példányok esetén ez az állapot magában foglalja a futtatókörnyezet állapotát, a vezénylési előzményeket, a bemeneteket, a kimeneteket és az egyéni állapotot. Az entitáspéldányok esetében tartalmazza az entitás állapotát.
  • Az üzenetek belső célokra használt függvénybemeneteket vagy kimeneteket, esemény-hasznos adatokat és metaadatokat tárolnak, például útválasztást és végpontok közötti korrelációt.

Az üzenetek a feldolgozás után törlődnek, de a példányállapotok megmaradnak, kivéve, ha az alkalmazás vagy egy operátor kifejezetten törli őket. A vezénylési előzmények különösen a vezénylés befejezése után is tárolóban maradnak.

Az állapotok és üzenetek a vezénylés előrehaladását szemléltetik, lásd a feladatközpont végrehajtási példáját.

A társzolgáltatótól függ, hogy hol és hogyan jelennek meg az állapotok és az üzenetek a tárolóban. A Durable Functions alapértelmezett szolgáltatója az Azure Storage, amely egy Ön által megadott Azure Storage-fiók üzenetsoraiban, tábláiban és blobjaiban tárolja az adatokat.

Szerializált és megőrzött adattípusok

Az alábbi lista a Durable Functions funkcióinak használatakor szerializálni és megmaradni kívánt adatok különböző típusait mutatja be:

  • A vezénylői, tevékenységi és entitásfüggvények összes bemenete és kimenete, beleértve az azonosítókat és a kezeletlen kivételeket is
  • Vezénylő, tevékenység és entitásfüggvények neve
  • Külső eseménynevek és hasznos adatok
  • Egyéni vezénylési állapot hasznos adatai
  • Vezénylési megszüntetési üzenetek
  • Tartós időzítő hasznos adatai
  • Tartós HTTP-kérés- és válasz URL-címek, fejlécek és hasznos adatok
  • Entitáshívások és -jelek hasznos adatai
  • Entitásállapot hasznos adatai

Bizalmas adatok használata

Az Azure Storage-szolgáltató használatakor a rendszer minden adatot automatikusan titkosít inaktív állapotban. A tárfiókhoz hozzáféréssel rendelkezők azonban titkosítatlan formában olvashatják az adatokat. Ha erősebb védelemre van szüksége a bizalmas adatokhoz, fontolja meg először az adatok titkosítását saját titkosítási kulcsokkal, hogy az adatok előre titkosított formában megmaradnak.

Alternatív megoldásként a .NET-felhasználók egyéni szerializálási szolgáltatókat is alkalmazhatnak, amelyek automatikus titkosítást biztosítanak. Ebben a GitHub-példában a titkosítással történő egyéni szerializálásra találhat példát.

Feljegyzés

Ha alkalmazásszintű titkosítás implementálása mellett dönt, vegye figyelembe, hogy a vezénylések és entitások határozatlan ideig létezhetnek. Ez akkor számít, amikor el kell forgatni a titkosítási kulcsokat, mert a vezénylés vagy entitások hosszabb ideig futnak, mint a kulcsforgatási szabályzat. Kulcsváltás esetén előfordulhat, hogy az adatok titkosításához használt kulcs már nem lesz elérhető a visszafejtéshez a vezénylés vagy entitás következő végrehajtásakor. Ezért az ügyféltitkosítás csak akkor ajánlott, ha a vezénylések és entitások várhatóan viszonylag rövid ideig futnak.

Szerializálás és deszerializálás testreszabása

Alapértelmezett szerializálási logika

A folyamatban lévő .NET-hez készült Durable Functions belsőleg a Json.NET használatával szerializálja a vezénylési és entitásadatokat a JSON-ba. A használt alapértelmezett Json.NET beállítások a következők:

Bemenetek, kimenetek és állapot:

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

Kivételek:

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

További részletes dokumentációt JsonSerializerSettings itt talál.

Szerializálás testreszabása .NET-attribútumokkal

A szerializálás során Json.NET különböző attribútumokat keres az osztályokon és tulajdonságokon, amelyek szabályozzák az adatok szerializálását és deszerializálását A JSON-ból. Ha a Durable Functions API-knak átadott adattípus forráskódjának tulajdonosa, érdemes lehet ezeket az attribútumokat hozzáadni a típushoz a szerializálás és a deszerializálás testreszabásához.

Szerializálás testreszabása függőséginjektálással

A .NET-et célzó és a Functions V3-futtatókörnyezetben futó függvényalkalmazások a Függőséginjektálás (DI) használatával testre szabhatják az adatok és kivételek szerializálásának módját. Az alábbi mintakód bemutatja, hogyan lehet a DI használatával felülbírálni az alapértelmezett Json.NET szerializálási beállításokat az egyéni implementációk és IErrorSerializerSettingsFactory a IMessageSerializerSettingsFactory szolgáltatási felületek használatával.

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