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

Cadence 是由 Uber 開發並開源的分佈式工作流編排引擎,旨在幫助開發者構建可擴展、可靠且具備容錯能力的分佈式應用程序。

這個 Uber 當前給我發了好多打車券,還是很厚道的。

特點

1. 容錯的有狀態工作流

Cadence 的工作流是 “容錯的有狀態工作流”,即使在進程崩潰或服務重啓的情況下,工作流的狀態(包括局部變量、調用棧、定時器等)也能自動恢復,確保業務流程不中斷。

2. 異步任務與自動重試

通過將業務邏輯拆分爲工作流(Workflow)和活動(Activity),Cadence 支持異步任務執行,並內置自動重試機制,確保任務在失敗後能夠自動重試,提升系統的可靠性。

3. 多語言支持

官方提供 Go 和 Java 的 SDK,社區還支持 Python 和 Ruby,方便開發者根據自身技術棧選擇合適的語言進行開發。這點確實很方便。

4. 可視化管理界面

Cadence 提供 Web UI,允許用戶查看工作流的執行狀態、歷史記錄,便於監控和調試。 親測界面挺好看的。

認識組件

Cadence 的架構主要包括以下組件:

這些服務協同工作,確保工作流的高可用性和可擴展性。

上手

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2-NNJbThzs24XgXeUSPoZA