你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

使用 Durable Task SDK for Go 开发

通过使用 Go 的 Durable Task SDK,你可以将编排、活动和持久实体定义为 Go 函数。 把应用托管在你自己的计算平台上。 Durable Task Scheduler 会存储执行历史,并将工作分配给你的 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 以记录传递依赖和校验和。

关于一个完整的应用程序,它可以启动一个辅助角色、调度并行活动、读取其结果并关闭,请参见“使用 Durable Task SDK 创建应用 - Go”。

编程模型

SDK作为一个Go模块发布。 其主要软件包包括:

Package Purpose
task 编排、活动和实体上下文;任务注册;持久工作流原语。
durabletaskscheduler 连接选项,以及到持久任务调度器的独立客户端连接和工作器连接。
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() 从注册表中推导出工作线程路由筛选器。 不要让工作线程处理仅由其他应用程序注册的任务。

客户和员工拥有不同的连接。 完成后关闭客户端。 如果应用的运行上下文已过期,则使用新的有界上下文排空该 workerShutdown。 快速启动会检查这两个操作是否报错。

编写确定性编排器

使用编排上下文进行持久操作:

运算 Go API Learn more
活动排序 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身份凭证链,或Authentication=AzureCLI用于通过Azure CLI登录的开发身份。 Go SDK 还支持托管身份和工作负载身份。 有关配置细节和支持的认证模式,请参见 Go SDK 连接指南。

快速入门从环境变量中读取 DTS_CONNECTION_STRING 连接字符串,并将其传递给 NewOptionsFromConnectionString。 SDK 不会默认读取这个变量。

Samples

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 功能矩阵和传输指南 ,了解详细的兼容性和生命周期行为。