使用 Durable Task SDK for Go 開發

透過使用 Go 的 Durable Task SDK,你可以將編排、活動和持久實體定義為 Go 函式。 把應用程式架設在你自己的運算平台上。 持久任務排程器會儲存執行歷史,並將工作派遣給你的 Go 工作程序。

Important

Go SDK 目前還在 測試階段。 這篇文章和 Go 快速入門 使用 v1.0.0-beta3。 這個測試版並非 v0.6.0 的直接替代品:它不支援嵌入式 SQLite 和 PostgreSQL 後端,也不支援獨立的 gRPC 主機。 Go 不是 Durable Functions 支援的語言。

先決條件和安裝

  • 需使用 Go 1.25 或更新版本。
  • Docker 或相容的容器執行環境,適用於 Durable Task Scheduler 模擬器。
  • 針對 Azure,需要有現有的排程器和工作中樞,以及具備 Durable Task Data Contributor 角色的身分識別。 參見 基於身份的存取。

從現有的 Go 模組安裝已發佈的測試版:

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

在程式碼中加入 SDK 匯入後,執行 go mod tidy 以記錄傳遞依賴關係和校驗和。

關於一個完整的應用程式,能啟動工作者、排程平行活動、讀取結果並關閉,請參考「 用持久任務 SDK 建立應用程式 - Go」。

程式設計模型

SDK 會以一個 Go 模組的形式提供。 其主要套件包括:

包裝 Purpose
task 編排、活動與實體上下文;任務註冊;持久工作流程原語。
durabletaskscheduler 連線選項,以及與持久任務排程器(Durable Task Scheduler)分開的客戶端與工作者連線。
client 工作者設定,包括並行性、版本控制與工作項目過濾器。
api 實例與實體 ID、協調元資料,以及管理請求選項。

編排器擁有簽章 func(*task.OrchestrationContext) (any, error)。 活動具有簽章 func(task.ActivityContext) (any, error)。 基於函數的實體簽名為 func(*task.EntityContext) (any, error)。 讀取使用 GetInput 鍵入的輸入,並回傳可序列化的結果或錯誤。 JSON 是預設的資料格式。

登錄並執行任務

以 task.NewTaskRegistry 建立一個登錄。 使用 AddOrchestratorN、AddActivityN 和 AddEntityN 註冊穩定名稱,並檢查註冊錯誤。 活動呼叫與客戶端排程中使用的名稱必須與註冊相符。

使用 durabletaskscheduler.NewOptionsFromConnectionString 解析 連接字串。 將選項傳遞給:

  • durabletaskscheduler.NewClient 用來啟動和管理編排實例。
  • durabletaskscheduler.NewWorker 用於執行已註冊的任務。

在 worker 上呼叫 Start 以開始處理工作項目。 使用 client.WithAutoWorkItemFilters() 從登錄推導工人路由過濾器。 不要讓工作程序處理只由其他應用程式登錄的任務。

客戶與工作程序擁有獨立的連線。 完成後關閉客戶端。 如果應用程式的執行上下文已過期,則使用全新且有界的上下文將工作者與 Shutdown 排空。 快速入門會檢查兩個操作的錯誤。

撰寫具決定性的協調器流程

使用協調流程內容執行 Durable 作業:

Operation Go API 深入了解
循序活動 ctx.CallActivity(...).Await(&result) 函式串接
分散開來,集中 排程所有任務,然後 ctx.WhenAll(tasks...),再用 Await 讀取結果 扇出/扇入
延遲 ctx.CreateTimer(duration).Await(nil) 耐用計時器
等待事件發生 ctx.WaitForSingleEvent(name, timeout).Await(&result) 外部活動
呼叫子工作流程 ctx.CallSubOrchestrator(...).Await(&result) 子管弦樂編曲
重試一個活動 task.WithActivityRetryPolicy 錯誤處理與重試
開啟全新的記錄 ctx.ContinueAsNew 永恆的管弦樂編曲
報告進度 ctx.SetCustomStatusValue 自訂狀態
呼叫或向實體發送訊號 ctx.CallEntity 與 ctx.SignalEntity 持久實體

不要在編排器中執行網路呼叫、檔案 I/O、環境變數讀取或其他非確定性工作。 將該工作放入活動中。 在協調器程式碼中,請使用 SDK 的持久並行原語,而非原生的 goroutine、通道、sync.WaitGroup 或 time.Sleep。 使用 ctx.Logger() 進行可重播感知記錄。 詳情請參見 Orchestrator 程式碼限制。

活動可以執行一般的 Go I/O,但它們可以執行不只一次。 使外部副作用具有冪等性。

讀取完成結果

WaitForOrchestrationCompletion 在沒有錯誤的情況下返回,表示該實例已達到終端狀態,但不一定表示工作流程已成功。 以 api.WithFetchPayloads(true) 要求請求酬載,檢查 RuntimeStatus 是否為 api.RUNTIME_STATUS_COMPLETED,然後用 ReadOutput 解碼輸出。

對於失敗的實例,請檢查 FailureDetails。 不要將失敗或已終止的協調流程回報為成功結果。 詳見 實例管理。

連線到模擬器或 Azure

快速啟動使用連接字串 Endpoint=http://localhost:8080;TaskHub=default;Authentication=None。 使用 Authentication=None 進行本地模擬器開發,而非用於經過驗證的 Azure 存取。

對於 Azure,請使用排程器的 HTTPS 端點和工作中樞名稱。 選擇 Authentication=DefaultAzure 以使用 Azure Identity 憑證鏈,或 Authentication=AzureCLI 以使用透過 Azure CLI 登入的開發身分。 Go SDK 也支援受控識別與工作負載識別。 關於設定細節及支援的認證模式,請參閱 Go SDK 連線指南。

快速啟動會從 DTS_CONNECTION_STRING 環境變數讀取 連接字串,並傳給 NewOptionsFromConnectionString。 SDK 不會自動讀取這個變數。

範例

Go SDK 存放庫包含可執行的功能範例,包括活動序列、扇出/扇入、外部事件、重試、持久實體、排程功能、大型有效載荷、歷史匯出及分散式追蹤。 完整清單、前置條件及執行說明,請參閱 Go SDK 範例。

測試協調流程

SDK 不包含儲存後端,因此編排只能在 Durable Task Scheduler 或其模擬器中執行。 使用一般 Go 單元測試來測試活動及其他商業邏輯。 為了驗證編排行為(包括重播),請對模擬器或專用工作中樞執行整合測試。

Beta 相容性考量

  • 排程: Go 排程不會與其他 SDK 共享其持久化狀態格式。 使用僅限 Go 的任務中心來處理排程任務。
  • 實體鎖:Go 和 Python 使用與 .NET 不同的多實體鎖排序。 不要同時在 Go/Python 和 .NET 協調流程中取得重疊的鎖集。
  • 倒帶: Go worker 會保守地拒絕包含在失敗活動或子操作後出現的額外非生命週期事件的歷史記錄。 已接受的回溯要求並不代表已恢復;請驗證新的執行 ID 及成功輸出。
  • 模擬器管理 API: 實例列表和篩選清除功能具有已記錄的模擬器限制。 對於範例,建議使用實例範圍的清理,且不要清除共用的 Hub。
  • 歷史匯出(預覽): 使用獨立、僅限 Go 的任務中樞和匯出目的地,使匯出工作無法匯出或刪除無關的應用程式資料。

請參閱 Go SDK 功能矩陣與傳輸指南 ,了解詳細的相容性與生命週期行為。