Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Important
Die Unterstützung für das In-Process-Modell endet am 10. November 2026. Es wird dringend empfohlen, dass Sie Ihre Apps in das isolierte Workermodell migrieren, um vollständigen Support zu erhalten.
Die Durable Functions-Laufzeit speichert automatisch Funktionsparameter, Rückgabewerte und andere Zustände im Task Hub, um eine zuverlässige Ausführung zu gewährleisten. Umfang und Häufigkeit der im dauerhaftem Speicher aufbewahrten Daten können sich jedoch auf die Leistung der Anwendung und die Kosten für Speichertransaktion auswirken. Abhängig von dem Datentyp, der von Ihrer Anwendung gespeichert wird, müssen auch die Richtlinien für die Datenaufbewahrung und den Datenschutz berücksichtigt werden.
In diesem Artikel wird erläutert, welche Daten beibehalten werden, wie sie große Nutzlasten und vertrauliche Daten behandeln und wie Sie die Serialisierung für jede unterstützte Sprache anpassen.
In diesem Artikel:
- Inhalt des Aufgabenhubs – Welche Daten gespeichert werden und wie
- Halten Sie Eingaben und Ausgaben klein – Strategien zum Verwalten der Nutzlastgröße
- Arbeiten mit vertraulichen Daten – Schützen von geheimnissen und persönlich identifizierbaren Informationen
- Sichern Des Task Hub-Speichers – Schützen Des Speicher-Back-End vor unbefugtem Zugriff
- Anpassen der Serialisierung und Deserialisierung – Sprachspezifische Serialisierungsoptionen
Inhalt des Aufgabenhubs
Aufgabenhubs speichern den aktuellen Status von Instanzen und alle ausstehenden Nachrichten:
- Instanzzustände speichern den aktuellen Status und den Verlauf einer Instanz. Für Orchestrierungsinstanzen umfasst dieser Status den Runtimezustand, den Orchestrierungsverlauf, Eingaben, Ausgaben und den benutzerdefinierten Status. Für Entitätsinstanzen enthält sie den Entitätsstatus.
- Nachrichten speichern Funktionseingaben oder -ausgaben, Ereignisnutzdaten und Metadaten, die für interne Zwecke verwendet werden, z. B. für Routing und End-to-End-Korrelation.
Nachrichten werden nach der Verarbeitung gelöscht, aber Instanzenzustände bleiben erhalten, es sei denn, sie werden explizit von der Anwendung oder einem Operator gelöscht. Insbesondere verbleibt eine Orchestrierungsgeschichte auch nach Abschluss der Orchestrierung im Speicher.
Ein Beispiel dafür, wie Zustände und Nachrichten den Fortschritt einer Orchestrierung darstellen, finden Sie im Ausführungsbeispiel des Aufgabenhubs.
Wo und wie Zustände und Nachrichten im Speicher dargestellt werden, hängt vom Speicheranbieter ab. Nutze Durable Task Scheduler , da es ein verwaltetes Backend für Task-Hubs bietet und den zugrundeliegenden Zustandsspeicher für dich verwaltet. Azure Storage bleibt jedoch eine solide Option für bestehende Workloads und für Apps, die ihre eigenen Speicherressourcen verwalten möchten.
| Speicheranbieter | Wie der Zustand gespeichert wird | Empfohlene Verwendung |
|---|---|---|
| Dauerhafter Aufgabenplaner | Orchestrierung und Entitätszustand werden im Managed Scheduler-Backend hinter einer Task-Hub-Ressource gespeichert. | Bevorzugte Option für neue Durable Functions-Apps und verwaltete Deployments. |
| Azure Storage | Zustände und Nachrichten werden in Warteschlangen, Tabellen und Blobs in einem Azure Storage-Konto dargestellt. | Gut geeignet für bestehende Apps oder Deployments, die bereits auf Azure Storage angewiesen sind. |
Datentypen, die serialisiert und beibehalten werden
In der folgenden Liste sind die verschiedenen Datentypen aufgeführt, die serialisiert und beibehalten werden, wenn Features von Durable Functions verwendet werden:
- Alle Ein- und Ausgaben von Orchestrator-, Aktivitäts- und Entitätsfunktionen, einschließlich aller IDs und nicht behandelten Ausnahmen
- Namen der Orchestrator-, Aktivitäts- und Entitätsfunktionen
- Namen und Nutzdaten externer Ereignisse
- Statusnutzdaten der benutzerdefinierten Orchestrierung
- Nachrichten zur Beendigung der Orchestrierung
- Dauerhafte Timernutzdaten
- Dauerhafte HTTP-Anforderungen und Antwort-URLs, Header und Nutzdaten
- Nutzdaten zu Entitätsaufrufen und Signalen
- Nutzdaten zum Entitätszustand
Anleitungen zum Verwalten der Nutzlastgröße und zum Schützen vertraulicher Elemente in dieser Liste finden Sie in den folgenden Abschnitten.
Halten Sie Durable Functions Eingaben und Ausgaben klein
Wenn Sie umfangreiche Eingaben und Ausgaben für und von Durable Functions-APIs bereitstellen, können Speicherprobleme auftreten. Eingaben und Ausgaben werden in die Orchestrierungshistorie serialisiert, was bedeutet, dass große Nutzlasten im Laufe der Zeit erheblich zu einem unkontrollierten Wachstum der Historie beitragen können. Dieses Wachstum birgt das Risiko, während der Wiedergabe Speicherfehler zu verursachen.
Um die Auswirkungen großer Eingaben und Ausgaben zu verringern, können Sie:
- Delegieren Sie Arbeit an Unter-Orchestratoren, um die Speicherbelastung des Verlaufs über mehrere Orchestratoren hinweg auszugleichen, so dass der Speicherbedarf einzelner Verläufe gering bleibt.
- Speichern Sie große Daten im externen Speicher (z. B. Azure Blob Storage), und übergeben Sie einfache Bezeichner, mit denen Sie diese Daten bei Bedarf innerhalb von Aktivitätsfunktionen abrufen können.
Für den Durable Task Scheduler verwenden Sie Large-Payload-Unterstützung, um größere Nutzlasten in Azure Blob Storage auszulagern. Für neue Apps wird dieses Muster empfohlen, wenn eine Orchestrierung große Nutzlasten zwischen dauerhaften Operationen weiterleiten muss. Wenn Sie den Azure Storage-Anbieter nutzen, können Sie weiterhin das im folgenden Abschnitt gezeigte Claim-Check-Muster anwenden und Lightweight-Referenzen zwischen den Operationen weitergeben.
Tip
Die bewährte Methode für den Umgang mit großen Daten besteht darin, sie bei Bedarf im externen Speicher zu halten und diese Daten nur innerhalb von Aktivitäten zu materialisieren.
Übergeben Sie Verweise auf große Datenmengen
Wählen Sie das Muster, das zu Ihrem Speicheranbieter passt.
Dauerhafter Aufgabenplaner
Wenn du den Durable Task Scheduler verwendest, aktiviere die Unterstützung für große Nutzlasten, sodass die Laufzeit größere Nutzlasten in Azure Blob Storage schreibt und eine kleine Referenz durch den Scheduler sendet. Eine typische Konfiguration ist in den Scheduler-Dokumenten dargestellt:
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DTS_CONNECTION_STRING",
"payloadStorageEnabled": true,
"payloadStorageThresholdBytes": 262144
},
"hubName": "%TASKHUB_NAME%"
}
}
}
Azure Storage
Mit dem Azure Storage-Anbieter können Sie das Claim Check-Muster verwenden, um die Orchestrierungshistorie klein zu halten und gleichzeitig große Payloads zu verarbeiten. Der Orchestrator übergibt eine leichte Referenz, die den Blob-Container und den Blob-Namen enthält, und die Aktivität liest oder schreibt die Nutzlast aus Azure Blob Storage nach Bedarf.
Die folgenden Beispiele gehen davon aus, dass Sie bereits einen Blob in Ihrem Speicherkonto haben. Beginne die Orchestrierung mit einer Referenz wie {"container":"large-payloads","blobName":"input/job-123.json"}. Die Aktivität erzeugt bei Bedarf den processed-payloads Ausgabecontainer. Der Sample-Verarbeitungsschritt kopiert die Eingabebytes unverändert; Ersetze sie durch deine Anwendungslogik.
Important
Fügen Sie niemals Speicherzugangsdaten oder eine Shared-Access-Signatur (SAS) in die Referenz ein. Das System behält die Referenz in der Orchestrierungsgeschichte bei. Diese Beispiele verwenden eine Appeinstellung namens PAYLOAD_STORAGE_CONNECTION_STRING, um den Speichercode knapp zu halten. Für Produktionsworkloads verwenden Sie Microsoft Entra ID, um den Zugriff auf Blob-Daten zu autorisieren.
Dieses Beispiel benötigt das Azure. Storage.Blobs NuGet-Paket.
using System;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask;
public record BlobReference(string Container, string BlobName);
public static class LargePayloadFunctions
{
[Function("ProcessLargePayload")]
public static async Task<BlobReference> RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
BlobReference inputReference = context.GetInput<BlobReference>()
?? throw new InvalidOperationException("A blob reference is required.");
return await context.CallActivityAsync<BlobReference>(
nameof(ProcessLargePayloadActivity), inputReference);
}
[Function(nameof(ProcessLargePayloadActivity))]
public static async Task<BlobReference> ProcessLargePayloadActivity(
[ActivityTrigger] BlobReference inputReference)
{
string connectionString =
Environment.GetEnvironmentVariable("PAYLOAD_STORAGE_CONNECTION_STRING")
?? throw new InvalidOperationException("Payload storage is not configured.");
BlobServiceClient service = new BlobServiceClient(connectionString);
BlobClient inputBlob = service
.GetBlobContainerClient(inputReference.Container)
.GetBlobClient(inputReference.BlobName);
BinaryData inputData = (await inputBlob.DownloadContentAsync()).Value.Content;
BlobContainerClient outputContainer =
service.GetBlobContainerClient("processed-payloads");
await outputContainer.CreateIfNotExistsAsync();
string outputName = $"processed/{Guid.NewGuid():N}.json";
await outputContainer.GetBlobClient(outputName)
.UploadAsync(inputData, overwrite: true);
return new BlobReference(outputContainer.Name, outputName);
}
}
Wenn parallele Aktivitäten mehrere große Ergebnisse liefern, geben Sie eine Liste von Referenzen zurück und leiten Sie diese Liste an eine abschließende Aggregationsaktivität weiter. Die Aggregationsaktivität sollte die Nutzlasten laden und kombinieren und dann einen letzten Ausgabeblob schreiben. Lade oder verkette die großen Ergebnisse nicht im Orchestrator.
Arbeiten mit vertraulichen Daten
Eingaben und Ausgaben (einschließlich Ausnahmen) an und von Durable Functions-APIs werden in Ihrem Storageanbieter der Wahl dauerhaft beibehalten. Wenn diese Eingaben, Ausgaben oder Ausnahmen vertrauliche Daten enthalten (z. B. geheime Daten, Verbindungszeichenfolgen oder persönlich identifizierbare Informationen), kann jeder Benutzer mit Lesezugriff auf die Ressourcen Ihres Speicheranbieters diese abrufen.
Um vertrauliche Daten sicher zu verarbeiten, rufen Sie diese Daten innerhalb von Aktivitätsfunktionen aus Azure Key Vault oder Umgebungsvariablen ab, und kommunizieren Sie diese Daten niemals direkt an Orchestratoren oder Entitäten. Dieser Ansatz verhindert, dass vertrauliche Daten in Ihre Speicherressourcen fließen.
Ebenso muss der Schreibzugriff auf Speicherressourcen eng kontrolliert werden, da manipulierte Daten im Speicher das Orchestrierungsverhalten ändern könnten. Weitere Informationen zum Sichern des Aufgabenhubspeichers finden Sie unter Sichern des Task Hub-Speichers.
Tip
Diese Anleitung gilt auch für die CallHttp Orchestrator-API, die ihre Anforderungs- und Antwortnutzlasten im Speicher speichert. Wenn für Ihre Ziel-HTTP-Endpunkte eine Authentifizierung erforderlich ist, implementieren Sie den HTTP-Aufruf innerhalb einer Aktivität, oder verwenden Sie die integrierte Unterstützung für verwaltete Identitäten, die von CallHttp angeboten wird, wodurch Anmeldeinformationen nicht im Speicher abgelegt werden.
Note
Vermeiden Sie das Protokollieren von Daten, die geheime Schlüssel enthalten, da jeder mit Lesezugriff auf Ihre Protokolle (z. B. in Application Insights) diese geheimen Schlüssel abrufen kann.
Verschlüsselung im Ruhezustand
Bei Verwendung des Azure Storage-Dienstes werden alle Daten im Ruhezustand automatisch verschlüsselt. Jeder Benutzer, der Zugriff auf das Speicherkonto hat, kann die Daten jedoch in unverschlüsselter Form lesen. Wenn Sie vertrauliche Daten stärker schützen möchten, sollten Sie in Erwägung ziehen, die Daten zunächst mit Ihren eigenen Verschlüsselungsschlüsseln zu verschlüsseln, damit die Daten in einer vorverschlüsselten Form gespeichert werden.
Alternativ können .NET-Benutzer benutzerdefinierte Serialisierungsanbieter implementieren, die eine automatische Verschlüsselung bereitstellen. Ein Beispiel für die benutzerdefinierte Serialisierung mit Verschlüsselung finden Sie in diesem GitHub-Beispiel.
Note
Wenn Sie sich für die Implementierung der Verschlüsselung auf Anwendungsebene entscheiden, beachten Sie, dass Orchestrierungen und Entitäten für eine unbegrenzte Zeit vorhanden sein können. Dies ist wichtig, wenn Sie Ihre Verschlüsselungsschlüssel rotieren müssen, da eine Orchestrierung oder Entitäten länger ausgeführt werden können, als Ihre Richtlinie für die Schlüsselrotation gilt. Bei einer Schlüsselrotation ist der Schlüssel zum Verschlüsseln der Daten möglicherweise nicht mehr für die Entschlüsselung verfügbar, wenn die Orchestrierung oder Entität das nächste Mal ausgeführt wird. Benutzerdefinierte Verschlüsselung wird daher nur empfohlen, wenn Orchestrierungen und Entitäten für relativ kurze Zeiträume laufen sollen.
Sichern Sie den Speicher Ihres Task Hub
Das Speicher-Back-End, das Ihren Aufgabenhub hostt, ist eine wichtige Vertrauensgrenze. Das Durable Task Framework vertraut den Daten, die es während der Wiederholung der Orchestrierung und der Nachrichtenverarbeitung aus dem Speicher liest. Jeder Benutzer, der Schreibzugriff auf den Aufgabenhubspeicher hat, kann den Orchestrierungsstatus, ausstehende Nachrichten oder gespeicherte Nutzlasten manipulieren. Dies kann das Anwendungsverhalten ändern, unbeabsichtigte Aktionen auslösen oder Remotecodeausführung im Kontext Ihrer Funktions-App erzielen.
Important
Geben Sie die Speicheranmeldeinformationen des Aufgabenhubs nicht preis, und gewähren Sie nicht vertrauenswürdigen Dritten keinen Schreibzugriff. Der Schreibzugriff auf den Task Hub-Speicher kann verwendet werden, um das Anwendungsverhalten zu ändern, einschließlich des Auslösens beliebiger Codeausführung.
Gemeinsame Verantwortung
Das Sichern des Speicher-Back-Ends liegt in Ihrer Verantwortung, genauso wie das Sichern einer Datenbank, die den Anwendungsstatus oder Code speichert. Das permanente Aufgabenframework führt keine Integritätsüberprüfung für gespeicherte Daten durch, sodass es von den Zugriffssteuerelementen der Speicherschicht abhängt, um nicht autorisierte Änderungen zu verhindern.
| Backend | Sicherheitsverantwortung | Leitlinien |
|---|---|---|
| Dauerhafter Aufgabenplaner | Microsoft verwaltet das zugrundeliegende Speicher-Backend. Sie verwalten Identitäten, den Zugriff auf den Task-Hubs und die Sicherheit auf App-Ebene. | Bevorzugter Standard für neue Durable Functions-Apps. |
| Azure Storage und andere BYO-Anbieter | Du verwaltest das Speicherkonto oder die Datenbank und dessen Sicherheitskontrollen. | Gut geeignet für bestehende Workloads oder Deployments, die bereits auf Azure Storage angewiesen sind. |
Note
Verwenden Sie nicht denselben Task Hub für nicht vertrauenswürdige Mandanten gemeinsam. Ein Aufgabenhub setzt keine Zugriffsgrenzen zwischen seinen Nutzern durch, sodass jeder Mandant, der den Aufgabenhub lesen oder in ihn schreiben kann, alle darin enthaltenen Orchestrierungen und Entitäten beeinflussen kann. Ebenso sollten Sie sich nicht auf separate Aufgabenhubs innerhalb desselben Back-Ends als Sicherheitsgrenze verlassen. Während der permanente AufgabenplanerRBAC unterstützt, der auf einzelne Aufgabenhubs festgelegt ist, gelten Netzwerksteuerelemente wie IP-Zulassungslisten und private Endpunkte nur auf Planerebene, sodass Aufgabenhubs innerhalb eines Schedulers keine Sicherheitsisolationsgrenze darstellen. Das gleiche gilt für BYO-Speicheranbieter– jeder Mandant mit Zugriff auf das Speicherkonto oder die Datenbank kann alle Aufgabenhubs auf diesem Back-End erreichen. Wenn Sie eine Sicherheitsisolation zwischen Mandanten benötigen, stellen Sie separate Infrastruktur für jeden Mandanten bereit: separate Speicherkonten oder Datenbanken für BYO-Anbieter oder separate Dauerhafte Taskplanerinstanzen.
Prüfliste für die Speicherhärtung
Wenden Sie die folgenden bewährten Methoden zum Schutz Ihres Task Hub-Speichers an:
Nutze identitätsbasierte Verbindungen für das von dir gewählte Backend.
- Mit Durable Task Scheduler setzen Sie auf verwaltete Identitäten und RBAC für den Scheduler und die Task Hubs.
- Bei Azure Storage und anderen BYO-Anbietern bevorzugen Sie, wo möglich, eine verwaltete Identität gegenüber Verbindungsstrings.
Siehe Konfigurieren einer verwalteten Identität für Durable Functions.
Wenden Sie RBAC-Rollen mit geringsten Berechtigungen an. Erteilen Sie nur die erforderlichen Mindestberechtigungen. Vermeiden Sie es, Nutzern oder Diensten, die ihn nicht benötigen, breiten Speicherzugang zu gewähren.
Beschränken Sie den Netzwerkzugriff auf Ihr Speicherkonto oder die Bereitstellung des Schedulers, indem Sie private Endpunkte oder Service-Endpunkte verwenden. Diese Einschränkung hilft, unbefugten Netzwerkzugriff auf Task-Hub-Daten zu verhindern.
Überwachen Sie den Speicherzugriff, indem Sie Azure Monitor-Ressourcenprotokolle für Ihr Speicherkonto aktivieren, insbesondere die Protokollkategorie
StorageWrite. Leiten Sie diese Protokolle an ein Ziel außerhalb des überwachten Speicherkontos weiter, z. B. Log Analytics, sodass sie nicht manipuliert werden können. Siehe Speicherprotokolle.Wechseln Sie Anmeldeinformationen regelmäßig, wenn Sie Verbindungszeichenfolgen verwenden. Behandeln Sie Speicherkontoschlüssel mit der gleichen Sorgfalt wie alle anderen Anmeldeinformationen mit hohen Berechtigungen.
Betrachten Sie ein verwaltetes Speicher-Back-End. Der Durable Task Scheduler übernimmt die Speichersicherheit automatisch, einschließlich Authentifizierung, RBAC und Netzwerkisolation, während Azure Storage explizite Speicherkontrolle bietet.
Anpassen der Serialisierung und Deserialisierung
Die Anpassungsoptionen für die Serialisierung variieren je nach Sprache. Wählen Sie die Registerkarte "Sprache" aus, um die verfügbaren Optionen anzuzeigen.
.NET (isoliert) und System.Text.Json
Durable Functions, die im .NET Isolated Worker-Prozess laufen, verwenden denselben Objektserialisierer, der global für Ihre Azure Functions-App konfiguriert ist (siehe WorkerOptions). Dieser Serialisierer ist System.Text.Json standardmäßig anstelle von Newtonsoft.Json. Alle Änderungen an WorkerOptions.Serializer wirken sich transitiv auf Durable Functions aus.
Weitere Informationen zur integrierten Unterstützung der JSON-Serialisierung in .NET finden Sie in der JSON-Serialisierung und Deserialisierung in .NET Übersichtsdokumentation.