golang,go,博客,开源,编程
Cadence 是由 Uber 开发并开源的分布式工作流编排引擎,旨在帮助开发者构建可扩展、可靠且具备容错能力的分布式应用程序。
Cadence 的工作流是“容错的有状态工作流”,即使在进程崩溃或服务重启的情况下,工作流的状态(包括局部变量、调用栈、定时器等)也能自动恢复,确保业务流程不中断。
通过将业务逻辑拆分为工作流(Workflow)和活动(Activity),Cadence 支持异步任务执行,并内置自动重试机制,确保任务在失败后能够自动重试,提升系统的可靠性。
官方提供 Go 和 Java 的 SDK,社区还支持 Python 和 Ruby,方便开发者根据自身技术栈选择合适的语言进行开发。这点确实很方便。
Cadence 提供 Web UI,允许用户查看工作流的执行状态、历史记录,便于监控和调试。 亲测界面挺好看的。
Cadence 的架构主要包括以下组件:
这些服务协同工作,确保工作流的高可用性和可扩展性。
可以通过 Docker 快速部署 Cadence:
git clone https://github.com/cadence-workflow/cadence.git
cd cadence/docker
docker-compose up
部署完成后,Web UI 默认运行在 http://localhost:8088
,可以通过浏览器访问。
以 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)
}
}
使用客户端启动工作流:
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 提供了强大的工作流编排能力,适用于构建复杂的分布式系统。
就先简单介绍到这里,祝大家六一儿童节快乐。