golang,go,博客,开源,编程

golang每日一库之工作流引擎cadence

Updated on with 0 views and 0 comments

Cadence 是由 Uber 开发并开源的分布式工作流编排引擎,旨在帮助开发者构建可扩展、可靠且具备容错能力的分布式应用程序。


特点

1. 容错的有状态工作流

Cadence 的工作流是“容错的有状态工作流”,即使在进程崩溃或服务重启的情况下,工作流的状态(包括局部变量、调用栈、定时器等)也能自动恢复,确保业务流程不中断。

2. 异步任务与自动重试

通过将业务逻辑拆分为工作流(Workflow)和活动(Activity),Cadence 支持异步任务执行,并内置自动重试机制,确保任务在失败后能够自动重试,提升系统的可靠性。

3. 多语言支持

官方提供 Go 和 Java 的 SDK,社区还支持 Python 和 Ruby,方便开发者根据自身技术栈选择合适的语言进行开发。这点确实很方便。

4. 可视化管理界面

Cadence 提供 Web UI,允许用户查看工作流的执行状态、历史记录,便于监控和调试。 亲测界面挺好看的。


认识组件

Cadence 的架构主要包括以下组件:

  • Frontend Service:接收客户端请求,进行初步处理。
  • History Service:负责维护工作流的历史记录和状态。
  • Matching Service:将任务分配给合适的工作节点(Worker)。
  • Worker:实际执行工作流和活动的代码逻辑。

这些服务协同工作,确保工作流的高可用性和可扩展性。


上手

1. 怎么部署

可以通过 Docker 快速部署 Cadence:

git clone https://github.com/cadence-workflow/cadence.git
cd cadence/docker
docker-compose up

部署完成后,Web UI 默认运行在 http://localhost:8088,可以通过浏览器访问。

2. 创建一个工作流试试水

以 Go 为例,定义一个简单的工作流和活动:

// 定义活动
func HelloActivity(ctx context.Context, name string) (string, error) {
    return "Hello, " + name + "!", nil
}

// 定义工作流
func HelloWorkflow(ctx workflow.Context, name string) (string, error) {
    ao := workflow.ActivityOptions{
        StartToCloseTimeout: time.Second * 10,
    }
    ctx = workflow.WithActivityOptions(ctx, ao)

    var result string
    err := workflow.ExecuteActivity(ctx, HelloActivity, name).Get(ctx, &result)
    return result, err
}

注册工作流和活动,并启动 Worker:

func main() {
    c, err := client.NewClient(client.Options{})
    if err != nil {
        log.Fatalln("Unable to create client", err)
    }
    defer c.Close()

    worker := worker.New(c, "hello-task-queue", worker.Options{})
    worker.RegisterWorkflow(HelloWorkflow)
    worker.RegisterActivity(HelloActivity)

    err = worker.Run(worker.InterruptCh())
    if err != nil {
        log.Fatalln("Unable to start worker", err)
    }
}

3. 启动东风41

使用客户端启动工作流:

workflowOptions := client.StartWorkflowOptions{
    ID:        "hello_workflow",
    TaskQueue: "hello-task-queue",
}

we, err := c.ExecuteWorkflow(context.Background(), workflowOptions, HelloWorkflow, "World")
if err != nil {
    log.Fatalln("Unable to execute workflow", err)
}

log.Println("Started workflow", "WorkflowID", we.GetID(), "RunID", we.GetRunID())

Cadence 提供了强大的工作流编排能力,适用于构建复杂的分布式系统。

就先简单介绍到这里,祝大家六一儿童节快乐。


标题:golang每日一库之工作流引擎cadence
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/06/01/1748759497514.html
联系:scotttu@163.com