Refer

Require

  • Docker

Overview

Cadence 是 Uber 公司推出的一种分布式,可拓展,高可用的任务流程编排引擎。其支持使用 Go 或者 Java 来进行编写编排代码,其对于业务逻辑进行了自定义的建模,分成了 工作流 workflow 活动 activities。workflow 指的是业务逻辑之间协调的实现,activities 指的是业务逻辑的实现。
68747470733a2f2f73332d75732d776573742d322e616d617a6f6e6177732e636f6d2f756265722d636f6d6d6f6e2d7075626c69632f7376632d636164656e63652d7765622f636164656e63652d7765622e64656d6f2e676966.gif

Install

Cadence 的启动方式很简单,仅需要以下步骤:

  1. 通过 git 获取完整项目

    1. $ git clone git@github.com:uber/cadence.git
    2. cd cadence
  2. 使用 docker-compose 启动

    1. cd docker
    2. docker-compose up -d

如果启动成功,通过 docker ps 可以查看到一下信息:

  1. 11d6f40237db ubercadence/web:3.4.1 "docker-entrypoint.s…" 32 minutes ago Up 32 minutes 0.0.0.0:8088->8088/tcp docker_cadence-web_1
  2. 03efbae1c37d ubercadence/server:master-auto-setup "/docker-entrypoint.…" 33 minutes ago Up 32 minutes 0.0.0.0:7933-7935->7933-7935/tcp, 0.0.0.0:7939->7939/tcp docker_cadence_1
  3. 0799976f7b00 cassandra:3.11 "docker-entrypoint.s…" 33 minutes ago Up 33 minutes 7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp docker_cassandra_1
  4. 48c474470495 graphiteapp/graphite-statsd "/entrypoint" 33 minutes ago Up 33 minutes 2004/tcp, 2013-2014/tcp, 2023-2024/tcp, 0.0.0.0:2003->2003/tcp, 0.0.0.0:8125-8126->8125-8126/tcp, 8080/tcp, 8125/udp, 0.0.0.0:8080->80/tcp docker_statsd_1

同时可以通过访问 localhost:8088 查看 UI 界面:
WeChat696c4536a6adacd18f5eef13c576dc03.png

Samples

官方自带了一些 samples 用于体验 Cadence 的功能,具体过程如下:

通过 Git 获取 samples 源码并 make:

  1. git clone git@github.com:samarabbas/cadence-samples.git
  2. cd cadence-samples
  3. make

启动 Cadence server (具体操作见 Install)

注册 Domain

通过 Cadence CLI 注册一个 Domain,这里注册 Domain 的目的是将想要统一管理调度的任务放在同一个 Domain 中一起监控,这里要求 任务所挂载的 Domain 名称要和创建的 Domain 名称相符:

  1. docker run --network=host --rm ubercadence/cli:master --do samples-domain domain register -rd 1
  2. Domain samples-domain successfully registered.

此时可以通过访问 localhost:8088 并且输入定义好的 Domain 名称进入控制面板:
WeChat1b150a14beed2e099ce66d98380569e6.png

WeChat8a3bfbe9ad532d6a72ea28e9f0f0c202.png

执行 Helloworld sample

  1. 首先创建 helloworld 的 workflow,并处于活跃状态,随时等待调用:

    1. $ ./bin/helloworld -m worker
    2. 2019-12-21T16:11:54.874+0800 INFO common/sample_helper.go:65 Logger created.
    3. 2019-12-21T16:11:54.891+0800 DEBUG common/factory.go:131 Creating RPC dispatcher outbound {"ServiceName": "cadence-frontend", "HostPort": "127.0.0.1:7933"}
    4. 2019-12-21T16:11:54.911+0800 INFO common/sample_helper.go:85 Domain successfully registered. {"Domain": "samples-domain"}
    5. 2019-12-21T16:11:55.022+0800 INFO internal/internal_worker.go:1036 Started Worker {"Domain": "samples-domain", "TaskList": "helloWorldGroup", "WorkerID": "1156@wbofengs-MacBook-Air.local@helloWorldGroup"}
  2. 执行 helloworld 的 workflow:

    1. $ ./bin/helloworld -m trigger
    2. 2019-12-21T16:12:37.836+0800 INFO common/sample_helper.go:65 Logger created.
    3. 2019-12-21T16:12:37.836+0800 DEBUG common/factory.go:131 Creating RPC dispatcher outbound {"ServiceName": "cadence-frontend", "HostPort": "127.0.0.1:7933"}
    4. 2019-12-21T16:12:37.844+0800 INFO common/sample_helper.go:85 Domain successfully registered. {"Domain": "samples-domain"}
    5. 2019-12-21T16:12:37.884+0800 INFO common/sample_helper.go:108 Started Workflow {"WorkflowID": "helloworld_c9004b59-bfd1-4057-a1dc-5373046556d9", "RunID": "920f5933-4cba-4ba4-909a-3e33be7ea0af"}

此时我们再来看一下 Cadence 的 Web 界面:
WeChatc5b50a22df8411770d06be285ab4171e.png

Other Samples

下面还有一些可以运行的示例,尝试运行并感受 cadence 充当了什么样的角色,同时他会在我们的方案中充当什么样的角色。

cron

  1. ./bin/cron -m worker

Start workflow with cron expression scheduled to run every minute.

  1. ./bin/cron -m trigger -cron "* * * * *"

dsl

  1. ./bin/dsl -m worker
  1. ./bin/dsl -m trigger -dslConfig cmd/samples/dsl/workflow1.yaml
  2. ./bin/dsl -m trigger -dslConfig cmd/samples/dsl/workflow2.yaml

expense

See more details in https://github.com/uber-common/cadence-samples/blob/master/cmd/samples/expense/README.md

语雀内容

fileprocessing

  1. ./bin/fileprocessing -m worker
  1. ./bin/fileprocessing -m trigger

recipes/branch

  1. ./bin/branch -m worker

Run branch workflow

  1. ./bin/branch -m trigger -c branch

Run parallel branch workflow

  1. ./bin/branch -m trigger -c parallel this will run the parallel branch workflow

recipes/choice

  1. ./bin/choice -m worker

Run the single choice workflow

  1. ./bin/choice -m trigger -c single

Run the multi choice workflow

  1. ./bin/choice -m trigger -c multi

greetings

  1. ./bin/greetings -m worker
  1. ./bin/greetings -m trigger

pickfirst

  1. ./bin/pickfirst -m worker
  1. ./bin/pickfirst -m trigger

mutex

  1. ./bin/mutex -m worker
  1. ./bin/mutex -m trigger

retryactivity

  1. ./bin/retryactivity -m worker
  1. ./bin/retryactivity -m trigger

splitmerge

  1. ./bin/splitmerge -m worker
  1. ./bin/splitmerge -m trigger

timer

  1. ./bin/timer -m worker
  1. ./bin/timer -m trigger

childworkflow

  1. ./bin/childworkflow -m worker
  1. ./bin/childworkflow -m trigger

dynamic

  1. ./bin/dynamic -m worker
  1. ./bin/dynamic -m trigger