Entwickle mit dem Durable Task SDK für Go

Mit dem Durable Task SDK für Go können Sie Orchestrierungen, Aktivitäten und dauerhafte Entitäten als Go-Funktionen definieren. Hosten Sie die Anwendung auf Ihrer eigenen Compute-Plattform. Der Durable Task Scheduler speichert die Ausführungshistorie und leitet die Arbeit an Ihre Go-Worker weiter.

Important

Das Go SDK befindet sich in der Beta-Phase. Dieser Artikel und der Go Quickstart verwenden v1.0.0-beta3. Die Beta ist kein Ersatz für v0.6.0: Sie unterstützt keine eingebetteten SQLite- und PostgreSQL-Backends oder den eigenständigen gRPC-Host. Go ist keine Durable Functions-Sprache.

Voraussetzungen und Installation

Installiere die veröffentlichte Beta aus einem bestehenden Go-Modul:

go get github.com/microsoft/durabletask-go@v1.0.0-beta3

Nachdem Sie SDK-Importe zu Ihrem Code hinzugefügt haben, führen Sie go mod tidy aus, um transitive Abhängigkeiten und Prüfsummen aufzuzeichnen.

Für eine vollständige Anwendung, die einen Worker startet, parallele Aktivitäten plant, deren Ergebnisse liest und ihn herunterfährt, siehe Eine App mit Durable Task SDKs erstellen – Go.

Programmiermodell

Das SDK wird als ein Go-Modul ausgeliefert. Seine Hauptpakete sind:

Package Purpose
task Orchestrierung, Aktivitäten und Entitätskontexte; Aufgabenregistrierung; dauerhafte Workflow-Primitive.
durabletaskscheduler Verbindungsoptionen sowie getrennte Client- und Worker-Verbindungen zum Durable Task Scheduler.
client Worker-Konfiguration, einschließlich Parallelität, Versionsmanagement und Arbeitsitem-Filter.
api Instanz- und Entitäts-IDs, Orchestrierungsmetadaten und Management-Anfrageoptionen.

Ein Orchestrator hat die Signatur func(*task.OrchestrationContext) (any, error). Eine Aktivität hat die Signatur func(task.ActivityContext) (any, error). Eine funktionsbasierte Entität hat die Signatur func(*task.EntityContext) (any, error). Lesen Sie die typisierte Eingabe mit GetInput, und geben Sie ein serialisierbares Ergebnis oder einen Fehler zurück. JSON ist das Standard-Datenformat.

Registrierung und Aufgaben ausführen

Erstelle eine Registrierung mit task.NewTaskRegistry. Registrieren Sie stabile Namen mit AddOrchestratorN, AddActivityN und AddEntityN und überprüfen Sie Registrierungsfehler. Die Namen, die in Aktivitätsaufrufen und der Client-Planung verwendet werden, müssen mit den Registrierungen übereinstimmen.

Analysieren Sie die Verbindungszeichenfolge mit durabletaskscheduler.NewOptionsFromConnectionString. Geben Sie die Optionen an:

  • durabletaskscheduler.NewClient um Orchestrierungsinstanzen zu starten und zu verwalten.
  • durabletaskscheduler.NewWorker zum Ausführen registrierter Aufgaben.

Rufen Sie Start auf dem Worker auf, damit er mit der Bearbeitung von Arbeitsaufgaben beginnt. Verwenden Sie client.WithAutoWorkItemFilters(), um Worker-Routing-Filter aus dem Register abzuleiten. Lassen Sie nicht zu, dass ein Worker Aufgaben verarbeitet, die nur von einer anderen Anwendung registriert wurden.

Der Kunde und der Worker haben getrennte Verbindungen. Schließen Sie den Client, wenn Sie fertig sind. Entleeren Sie den Worker mit Shutdown, indem Sie einen frischen, begrenzten Kontext verwenden, falls der Ausführungskontext der Anwendung abgelaufen ist. Der Quickstart prüft beide Operationen auf Fehler.

Schreibe deterministische Orchestratoren

Nutzen Sie den Orchestrierungskontext für Durable Operations:

Operation Go API Weitere Informationen
Aktivitäten anordnen ctx.CallActivity(...).Await(&result) Funktionsverkettung
Auffächern und Zusammenführen Planen Sie alle Aufgaben, dann ctx.WhenAll(tasks...) und lesen Sie die Ergebnisse mit Await Fan-out/fan-in
Verzögerung ctx.CreateTimer(duration).Await(nil) Zuverlässige Zeitgeber
Warte auf ein Ereignis ctx.WaitForSingleEvent(name, timeout).Await(&result) Externe Ereignisse
Einen Kind-Workflow aufrufen ctx.CallSubOrchestrator(...).Await(&result) Sub-Orchestrierungen
Wiederholen einer Aktivität task.WithActivityRetryPolicy Fehlerbehandlung und Wiederholungsversuche
Starte einen neuen Verlauf ctx.ContinueAsNew Ewige Orchestrationen
Fortschritt melden ctx.SetCustomStatusValue Benutzerdefinierter Status
Rufen oder kennzeichnen Sie ein Element ctx.CallEntity und ctx.SignalEntity Dauerhafte Entitäten

Führe keine Netzwerkaufrufe, keine Datei-I/O, Umgebungsvariablen-Reads oder andere nichtdeterministische Arbeiten in einem Orchestrator durch. Ordne diese Arbeit Aktivitäten zu. Verwenden Sie die robusten Nebenläufigkeitsprimitive des SDK anstelle nativer Goroutinen, Kanäle, time.Sleep oder sync.WaitGroup im Orchestrator-Code. Verwenden Sie ctx.Logger() für Replay-berücksichtigendes Logging. Einzelheiten finden Sie unter Orchestrator-Codeeinschränkungen.

Aktivitäten können gewöhnliche Go-I/O ausführen, aber sie können mehr als einmal ablaufen. Sorgen Sie dafür, dass externe Nebenwirkungen idempotent sind.

Abschlussergebnisse lesen

WaitForOrchestrationCompletion Ohne Fehler zurückzukehren bedeutet, dass die Instanz einen terminalen Zustand erreicht hat, nicht unbedingt, dass der Workflow erfolgreich war. Payloads mit api.WithFetchPayloads(true) anfordern, prüfen Sie, dass RuntimeStatusapi.RUNTIME_STATUS_COMPLETED ist, und decodieren Sie dann die Ausgabe mit ReadOutput.

Prüfen Sie bei fehlgeschlagenen Fällen FailureDetails. Melde keine fehlgeschlagene oder abgebrochene Orchestrierung als erfolgreiches Ergebnis. Siehe Instanzverwaltung.

Verbinden Sie sich mit dem Emulator oder Azure

Der Quickstart verwendet den Verbindungszeichenfolge Endpoint=http://localhost:8080;TaskHub=default;Authentication=None. Verwenden Sie Authentication=None für die Entwicklung lokaler Emulatoren, nicht für authentifizierten Azure-Zugriff.

Für Azure verwenden Sie den HTTPS-Endpunkt Ihres Schedulers und den Namen des Task Hubs. Wählen Sie Authentication=DefaultAzure für die Azure Identity-Credential-Kette oder Authentication=AzureCLI für eine Entwicklungsidentität, die über Azure CLI angemeldet ist. Das Go SDK unterstützt außerdem Managed Identity und Workload Identity. Für Konfigurationsdetails und unterstützte Authentifizierungsmodi siehe den Go SDK-Verbindungsleitfaden.

Der Quickstart liest den Verbindungszeichenfolge aus der DTS_CONNECTION_STRING Umgebungsvariable und übergibt ihn an NewOptionsFromConnectionString. Das SDK liest diese Variable nicht automatisch.

Beispiele

Das Go SDK-Repository enthält lauffähige Beispiele für seine Funktionsbereiche, darunter Aktivitätssequenzen, Fan-Out/Fan-in, externe Events, Retrys, Durable Entities, Zeitpläne, große Nutzlasten, History-Export und verteiltes Tracing. Für die vollständige Liste, die Voraussetzungen und die Ausführungsanweisungen siehe die Go-SDK-Beispiele.

Testorchestrierungen

Das SDK enthält kein Speicher-Backend, sodass Orchestrierungen nur gegen den Durable Task Scheduler oder dessen Emulator ausgeführt werden. Testen Sie Aktivitäten und andere Geschäftslogik mit gewöhnlichen Go-Unit-Tests. Um das Orchestrierungsverhalten, einschließlich Replay, zu überprüfen, führen Sie Integrationstests gegen den Emulator oder einen dedizierten Task-Hub durch.

Überlegungen zur Beta-Kompatibilität

  • Schedules: Go-Schedules teilen ihr persistent State-Format nicht mit anderen SDKs. Nutze einen Go-only Task-Hub für geplante Aufgaben.
  • Entitätssperren: Go und Python verwenden eine andere Multi-Entity-Lock-Reihenfolge als .NET. Erwerben Sie nicht gleichzeitig überlappende Locksets über Go/Python- und .NET-Orchestrierungen.
  • Zurückspulen: Der Go-Worker lehnt Verläufe mit zusätzlichen nicht-lebenszyklusbezogenen Ereignissen nach einer fehlgeschlagenen Aktivität oder untergeordneten Operation vorsichtig ab. Eine akzeptierte Zurücksetzungsanfrage beweist keine Wiederherstellung; verifiziere eine neue Ausführungs-ID und eine erfolgreiche Ausgabe.
  • Emulator-Management-APIs: Instanzlisten und gefilterte Löschungen haben dokumentierte Einschränkungen für Emulatoren. Bevorzuge instanzbezogene Bereinigung in Beispielen und lösche keinen freigegebenen Hub.
  • Verlaufsexport (Vorschau): Verwenden Sie einen isolierten, ausschließlich für Go vorgesehenen Task Hub und ein Exportziel, damit Exportaufträge keine nicht zugehörigen Anwendungsdaten exportieren oder löschen können.

Siehe die Go-SDK-Funktionsmatrix und den Transportleitfaden für detaillierte Kompatibilität und Lebenszyklusverhalten.