Sviluppa con il SDK Durable Task per Go

Utilizzando il Durable Task SDK for Go, puoi definire orchestrazioni, attività ed entità durevoli come funzioni Go. Ospita l'applicazione sulla tua piattaforma di elaborazione. Il Durable Task Scheduler memorizza la cronologia delle esecuzioni e invia il lavoro ai tuoi lavoratori Go.

Importante

L’SDK di Go è in versione beta. Questo articolo e il quickstart di Go usano la v1.0.0-beta3. La beta non è un sostituto diretto della versione 0.6.0: non supporta backend embedded SQLite e PostgreSQL né l'host gRPC standalone. Go non è un linguaggio supportato da Durable Functions.

Prerequisiti e installazione

Installa la beta rilasciata in un modulo Go esistente:

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

Dopo aver aggiunto importazioni SDK al tuo codice, esegui go mod tidy per registrare dipendenze transitive e checksum.

Per un'applicazione completa che avvia un lavoratore, programma attività parallele, ne legge i risultati e si arresta, vedi Crea un'app con Durable Task SDKs - Go.

Modello di programmazione

SDK viene fornito come un unico modulo Go. I suoi principali pacchetti sono:

Pacchetto Purpose
task Contesti di orchestrazione, attività e entità; registrazione dei compiti; primitive di workflow durature.
durabletaskscheduler Opzioni di connessione e connessioni separate del client e del worker a Durable Task Scheduler.
client Configurazione dei worker, inclusi concorrenza, versioning e filtri degli elementi di lavoro.
api ID di istanze ed entità, metadati di orchestrazione e opzioni di richiesta di gestione.

Un orchestratore ha la firma func(*task.OrchestrationContext) (any, error). Un'attività ha la firma func(task.ActivityContext) (any, error). Un'entità basata su funzioni ha la firma func(*task.EntityContext) (any, error). Leggi input tipizzato con GetInput, e restituisci un risultato serializzato o un errore. JSON è il formato dati predefinito.

Registrare ed eseguire attività

Crea un registro di sistema con task.NewTaskRegistry. Registrare i nomi stabili con AddOrchestratorN, AddActivityN e AddEntityN e verificare gli errori di registrazione. I nomi utilizzati nelle chiamate di attività e nella pianificazione del client devono corrispondere alle registrazioni dei componenti.

Analizzare la stringa di connessione con durabletaskscheduler.NewOptionsFromConnectionString. Passare le opzioni a:

  • durabletaskscheduler.NewClient per avviare e gestire istanze di orchestrazione.
  • durabletaskscheduler.NewWorker per eseguire attività pianificate.

Invoca Start sul worker per iniziare a elaborare gli elementi di lavoro. Usare client.WithAutoWorkItemFilters() per derivare filtri di instradamento worker dal registro. Non lasciare che un worker consumi attività registrate solo da un'altra applicazione.

Il cliente e il worker hanno connessioni separate. Chiudi il client quando hai finito. Svuota il worker con Shutdown, usando un contesto nuovo e delimitato se il contesto di esecuzione dell'applicazione è scaduto. L'avvio rapido verifica la presenza di errori in entrambe le operazioni.

Scrivere orchestratori deterministici

Usa il contesto di orchestrazione per operazioni durabili:

Operation Go API Ulteriori informazioni
Sequenza attività ctx.CallActivity(...).Await(&result) Catena di funzioni
Fan-out e fan-in Programmare tutte le attività, poi ctx.WhenAll(tasks...) e leggere i risultati con Await Fan-out/fan-in
Ritardo ctx.CreateTimer(duration).Await(nil) Timer durevoli
Attendi un evento ctx.WaitForSingleEvent(name, timeout).Await(&result) Eventi esterni
Chiama un flusso di lavoro figlio ctx.CallSubOrchestrator(...).Await(&result) Orchestrazioni secondarie
Ripetere un'attività task.WithActivityRetryPolicy Gestione degli errori e ritentativi
Inizia una nuova cronologia ctx.ContinueAsNew Orchestrazioni eterne
Segnala stato ctx.SetCustomStatusValue Stato personalizzato
Chiama o segnala un'entità ctx.CallEntity e ctx.SignalEntity Entità durevoli

Non eseguire chiamate di rete, I/O file, letture delle variabili d'ambiente o altro lavoro non deterministico in un orchestratore. Sposta quel lavoro in Attività. Usa le primitive di concorrenza durevoli dell'SDK invece di goroutine e canali nativi, sync.WaitGroup o time.Sleep nel codice dell'orchestratore. Usa ctx.Logger() per il logging compatibile con il replay. Per dettagli, vedi i vincoli di codice di Orchestrator.

Le attività possono eseguire normali operazioni di I/O Go, ma possono eseguire più di una volta. Fai sì che gli effetti collaterali esterni siano idempotenti.

Leggi i risultati di completamento

WaitForOrchestrationCompletion Ritornare senza errore significa che l'istanza ha raggiunto uno stato terminale, non necessariamente che il flusso di lavoro abbia avuto successo. Richiedi payload con api.WithFetchPayloads(true), verifica che RuntimeStatus sia api.RUNTIME_STATUS_COMPLETED, e poi decodifica l'uscita con ReadOutput.

Per le istanze fallite, ispezionare FailureDetails. Non segnalare un'orchestrazione fallita o terminata come risultato positivo. Vedi gestione delle istanze.

Connettiti all'emulatore o ad Azure

Il quickstart utilizza la stringa di connessione Endpoint=http://localhost:8080;TaskHub=default;Authentication=None. Usa Authentication=None per lo sviluppo locale con emulatori, non per l'accesso autenticato ad Azure.

Per Azure, usa l'endpoint HTTPS e il nome del task hub del tuo scheduler. Seleziona Authentication=DefaultAzure per la catena di credenziali Azure Identity, oppure Authentication=AzureCLI per un'identità di sviluppo che ha eseguito l'accesso tramite interfaccia della riga di comando di Azure. Go SDK supporta anche l'identità gestita e workload identity. Per i dettagli di configurazione e le modalità di autenticazione supportate, consulta la guida alla connessione Go SDK.

Il quickstart legge la stringa di connessione dalla DTS_CONNECTION_STRING variabile environment e la passa a NewOptionsFromConnectionString. L'SDK non legge automaticamente questa variabile.

Esempi

Il repository dell'SDK Go include campioni eseguibili per le sue aree di funzionalità, tra cui sequenze di attività, fan-out/fan-in, eventi esterni, retries, entità durature, schedulazioni, grandi payload, esportazione della cronologia e tracciamento distribuito. Per la lista completa, i prerequisiti e le istruzioni di esecuzione, consulta gli esempi di Go SDK.

Orchestrazioni di prova

L'SDK non include un back-end di archiviazione, quindi le orchestrazioni vengono eseguite solo su Durable Task Scheduler o sul suo emulatore. Esegui test su attività e altra logica di business con i normali test unitari Go. Per verificare il comportamento dell'orchestrazione, incluso il replay, esegui test di integrazione sull'emulatore o su un task hub dedicato.

Considerazioni sulla compatibilità beta

  • Orari: Gli orari di Go non condividono il loro formato di stato persistente con altri SDK. Usa un task hub solo Go per le attività programmate.
  • Blocchi di entità: Go e Python usano un ordine di locks multi-entità diverso da .NET. Non acquisire set di lock sovrapposti contemporaneamente tra orchestrazioni Go/Python e .NET.
  • Riavvolgi: L'operatore Go rifiuta in modo conservativo le storie con ulteriori eventi non legati al ciclo di vita dopo un'attività fallita o un'operazione figlia. Una richiesta di rollback accettata non prova il recupero; verifica un nuovo ID di esecuzione e un output riuscito.
  • API di gestione emulatori: L'elenco delle istanze e la purga filtrata presentano limitazioni documentate degli emulatori. Preferire la pulizia a livello di istanza per gli esempi e non svuotare un hub condiviso.
  • Esportazione della cronologia (anteprima): Usa un hub di attività isolato, solo Go, e una destinazione di esportazione in modo che i processi di esportazione non possano esportare o eliminare dati applicativi non correlati.

Consulta la matrice di funzionalità e la guida ai transport del Go SDK per dettagli sulla compatibilità e sul comportamento del ciclo di vita.