Golang Cadence工作流引擎入门
最近在学习Golang的Cadence工作流引擎,想请教几个入门问题:
- Cadence工作流的基本概念和核心组件是什么?
- 如何用Golang搭建最简单的Cadence工作流示例?
- 在开发过程中有哪些常见的坑需要注意?
- Cadence与其他工作流引擎(如Temporal)相比有什么优势和劣势?
作为新手,应该从哪些方面入手来快速掌握Cadence?希望能得到一些学习建议和最佳实践。
2 回复
Golang Cadence 工作流引擎是一个用于构建可靠、可扩展分布式应用的工具,由 Uber 开发。它基于事件溯源模式,确保工作流状态持久化,支持长时间运行的任务和错误恢复。以下是入门指南:
核心概念
- 工作流(Workflow):定义业务逻辑的执行流程,可包含活动、决策和等待条件。
- 活动(Activity):执行具体任务(如调用 API、数据库操作),可重试。
- 工作流客户端:用于启动和与工作流交互。
- 工作流工作者(Worker):监听并执行工作流和活动任务。
安装
使用 Go modules 安装 Cadence 客户端库:
go get -u go.uber.org/cadence
示例代码
- 定义活动:
package main
import "context"
// 示例活动函数
func SimpleActivity(ctx context.Context, name string) (string, error) {
return "Hello " + name + "!", nil
}
- 定义工作流:
package main
import (
"go.uber.org/cadence/workflow"
"go.uber.org/cadence/activity"
"time"
)
// 工作流函数
func SimpleWorkflow(ctx workflow.Context, name string) error {
options := workflow.ActivityOptions{
StartToCloseTimeout: time.Second * 30,
}
ctx = workflow.WithActivityOptions(ctx, options)
var result string
err := workflow.ExecuteActivity(ctx, SimpleActivity, name).Get(ctx, &result)
if err != nil {
return err
}
workflow.GetLogger(ctx).Info("Workflow completed:", result)
return nil
}
- 注册工作流和活动:
package main
import (
"go.uber.org/cadence/worker"
"go.uber.org/cadence/client"
)
func main() {
// 配置 Cadence 服务客户端
serviceClient, err := client.NewClient(client.Options{
HostPort: "127.0.0.1:7933", // Cadence 服务器地址
Domain: "test-domain",
})
if err != nil {
panic(err)
}
// 创建工作流工作者
w := worker.New(serviceClient, "task-list-name", worker.Options{})
w.RegisterWorkflow(SimpleWorkflow)
w.RegisterActivity(SimpleActivity)
// 启动工作者
err = w.Run()
if err != nil {
panic(err)
}
}
- 启动工作流:
package main
import (
"context"
"go.uber.org/cadence/client"
)
func startWorkflow() {
serviceClient, _ := client.NewClient(client.Options{
HostPort: "127.0.0.1:7933",
Domain: "test-domain",
})
options := client.StartWorkflowOptions{
TaskList: "task-list-name",
}
_, err := serviceClient.StartWorkflow(context.Background(), options, SimpleWorkflow, "World")
if err != nil {
panic(err)
}
}
运行步骤
- 启动 Cadence 服务器(使用 Docker 或本地安装)。
- 运行工作者程序监听任务。
- 使用客户端启动工作流。
注意事项
- 工作流函数必须确定性(避免随机数、时间依赖)。
- 活动函数可包含非确定性操作。
- 使用
workflow.Sleep替代time.Sleep。
通过以上步骤,您可以快速入门 Golang Cadence,构建可靠的分布式应用。参考官方文档以探索高级功能如信号、查询和重试策略。


