Temporal

Temporal 是一个开源的支持持久化微服务编排的工作流引擎。

对于一个工作流,可以包含多个步骤,如 A -> B, C -> D 形成一个复杂的 DAG 图。Temporal 支持工作流持久化,即当工作流执行步骤 A 后,发生异常,重试时会略过执行过的 A,继而执行后续的 B, C -> D

Temporal 的性能非常的高,可同时支持百万级工作流。知名数据集成工具 airbyte 即使用 Temporal 作为定时调度工具。根据笔者亲身体验,使用 Temporal 作为定时任务引擎,通过 CronJob 支持超过 4w+ 调度频率在 3s ~ 5min 的定时任务。

文档链接:

安装

Docker

clone 对应的 github 仓库到本地,按需选择部署方式即可

Kubernetes

准备 mysql

Temporal 支持部署时,动态创建对应的库表结构和初始化数据,但是如果因为外部限制,无法在部署时创建库表结构,需要通过工单系统申请数据库,创建库表,因此在初始化数据库时需要额外操作:

  • 通过 docker compose 方式本地创建对应版本的 temporal,使用 mysql 数据库访问工具,连接 mysql,导出库表结构和数据。数据库连接信息可以从 docker-compose.yml 文件中获得为准:
    • jdbc-url: jdbc:mysql://localhost:3306
    • user: root
    • password: root
  • 在申请好的数据库中导入上一步的库表结构和数据

创建 temporal

下载需要的版本,使用 helm 创建。

创建 values.yaml 文件添加如下内容。这里将存储切换成了 mysql,关闭了自动建表和表结构升级,关闭了 grafana 和 prometheus

server:
  config:
    persistence:
      defaultStore: default
      additionalStores: {}
      default:
        driver: "sql"
        sql:
          driver: "mysql"
          host: "localhost"
          port: 3306
          database: "temporal"
          user: "temporal_user"
          password: "temporal_password"
          existingSecret: ""
          secretName: ""
          maxConns: 20
          maxConnLifetime: "1h"
          # connectAttributes:
          # tx_isolation: 'READ-COMMITTED'

      visibility:
        driver: "sql"
        sql:
          driver: "mysql"
          host: "localhost"
          port: 3306
          database: "temporal_visibility"
          user: "temporal_visibility_user"
          password: "temporal_visibility_password"
          existingSecret: ""
          secretName: ""
          maxConns: 20
          maxConnLifetime: "1h"
          # connectAttributes:
          #   tx_isolation: 'READ-COMMITTED'


schema:
  setup:
    enabled: false
  update:
    enabled: false

elasticsearch:
  enabled: false

prometheus:
  enabled: false
  nodeExporter:
    enabled: false

grafana:
  enabled: false

cassandra:
  enabled: false

mysql:
  enabled: true

创建 temporal

helm install temporal /path/to/helm -n temporal --create-namespace --values values.yaml

常用操作

创建、删除 namespace

调整限流