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.
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
- Go 1.25 oder später.
- Docker oder eine kompatible Containerlaufzeit für den Durable Task Scheduler-Emulator.
- Für Azure: einen bestehenden Scheduler und Task Hub sowie eine Identität mit der Rolle Durable Task Data Contributor. Siehe identitätsbasierter Zugriff.
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.NewClientum Orchestrierungsinstanzen zu starten und zu verwalten. -
durabletaskscheduler.NewWorkerzum 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.