Cadence:馴服複雜流程的工作流引擎

banq發表於2022-02-05

Cadence是一個開源的無故障狀態程式碼平臺和工作流引擎,專為解決與第三方 API、內部服務和長期執行的業務流程進行復雜互動的挑戰。Cadence 為使用需要容錯的基於微服務架構以及包含無數多步驟併發工作流或與多個第三方 API 互動的應用程式的開發團隊提供了很多價值。
Cadence 將應用程式的整個狀態儲存在與任何特定程式無關的持久虛擬記憶體中。儲存的應用程式狀態包括使用者定義活動的所有呼叫引數和返回結果。然後,它使用該資訊來趕上並重播被中斷的工作流。
Cadence 擁有使開發人員能夠使用 Java、Go、Python 和 Ruby 等流行語言建立和協調工作流的庫。Cadence 服務(例如工作人員)在很大程度上是無狀態的,並利用資料儲存來實現任務/工作流的永續性。支援的儲存選項包括開源 Cassandra 和 MySQL/PostgreSQL,並且介面卡可用於任何具有多行單分片事務的資料庫。還提供多種服務部署模型。例如,Uber 使用由數百個應用程式共享的多租戶 Cadence 叢集。
Cadence 的優勢體現在以下用例中:
  • 定期執行(分散式 cron)。Cadence 保證定期排程的業務邏輯的執行,完成複雜的錯誤處理、重試策略和非同步歷史事件複製。重要的是,Cadence 支援大規模並行執行作業,能夠同時執行數百萬個工作流。

  • 微服務編排。實現為多個微服務呼叫的業務流程必須使所有這些呼叫成功,即使下游服務失敗。Cadence 保證工作流程式碼的完成,支援無限重試並使補償邏輯易於開發,例如 SAGA 模式。

  • 輪詢。定期檢查狀態更改的輪詢作業(通常用於監視或檔案處理)與 Cadence 對長時間執行的活動和無限重試的支援特別匹配。

  • 事件驅動的應用程式。Cadence 直接支援非同步事件,併為開發人員抽象出狀態持久化的複雜性,使實現偵聽多個事件源的應用程式變得簡單。

  • 儲存掃描。Cadence 支援對大型分割槽資料集(甚至是數十億個檔案)進行可擴充套件、彈性和完整的掃描。

  • 批次作業。對於外部 API 呼叫可能失敗的批處理作業,Cadence 保證永續性。

  • 基礎設施供應。長時間執行的配置操作可能會出現間歇性故障;Cadence 可以防止這種情況發生。該平臺還支援將活動執行路由到特定程式或主機,以及可擴充套件的容錯鎖定行為以一次在資源上執行單個突變。

  • CI/CD 管道和應用程式部署。透過使開發人員能夠專注於業務邏輯,Cadence 為構建部署解決方案提供了一個理想的平臺。

  • 運營管理。Cadence 支援自動管理和恢復,以建立自運算元據庫等。

  • 互動式應用程式。Cadence 的效能和可擴充套件性支援 UI 會話狀態跟蹤和同步後臺操作執行。

  • DSL 工作流程。Cadence SDK 允許開發人員編寫解釋 DSL 流程定義的容錯、可擴充套件、持久的應用程式。

  • 大資料和機器學習。Cadence 為大資料和機器學習解決方案提供強大的控制平面,提供任務執行路由來控制 ML 模型和其他檔案的分配方式。


要開始使用 Cadence,請獲取Cadence 伺服器或Docker 映像的[url=https://github.com/uber/cadence]GitHub 儲存庫[/url]。

在此處獲取最新的 Cadence Java 客戶端。將其作為依賴項包含在您的 Java 專案中:
透過向連線到 Cadence 服務的工作人員註冊,將此工作流連結到 Cadence 框架(工作人員預設連線到本地執行的服務)。

public static void main(String[] args) {
  WorkflowClient workflowClient =
      WorkflowClient.newInstance(
          new WorkflowServiceTChannel(ClientOptions.defaultInstance()),
          WorkflowClientOptions.newBuilder().setDomain(DOMAIN).build());
  // Get worker to poll the task list.
  WorkerFactory factory = WorkerFactory.newInstance(workflowClient);
  Worker worker = factory.newWorker(TASK_LIST);
  worker.registerWorkflowImplementationTypes(HelloWorldImpl.class);
  factory.start();
}


現在,透過執行工作程式使用 CLI 執行 Hello World 工作流。

> docker run --network=host --rm ubercadence/cli:master --do test-domain workflow start --tasklist HelloWorldTaskList --workflow_type HelloWorld::sayHello --execution_timeout 3600 --input \"World\"
 
Started Workflow Id: bcacfabd-9f9a-46ac-9b25-83bcea5d7fd7, run Id: e7c40431-8e23-485b-9649-e8f161219efe


 

相關文章