golang 每日一庫之工作流引擎 cadence
Cadence 是由 Uber 開發並開源的分佈式工作流編排引擎,旨在幫助開發者構建可擴展、可靠且具備容錯能力的分佈式應用程序。
這個 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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/2-NNJbThzs24XgXeUSPoZA