Refer
Require
- Docker
Overview
Cadence 是 Uber 公司推出的一种分布式,可拓展,高可用的任务流程编排引擎。其支持使用 Go 或者 Java 来进行编写编排代码,其对于业务逻辑进行了自定义的建模,分成了 工作流 workflow 和 活动 activities。workflow 指的是业务逻辑之间协调的实现,activities 指的是业务逻辑的实现。
Install
Cadence 的启动方式很简单,仅需要以下步骤:
通过 git 获取完整项目
$ git clone git@github.com:uber/cadence.git
cd cadence
使用 docker-compose 启动
cd docker
docker-compose up -d
如果启动成功,通过 docker ps
可以查看到一下信息:
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
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
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
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 界面:
Samples
官方自带了一些 samples 用于体验 Cadence 的功能,具体过程如下:
通过 Git 获取 samples 源码并 make:
git clone git@github.com:samarabbas/cadence-samples.git
cd cadence-samples
make
启动 Cadence server (具体操作见 Install)
注册 Domain
通过 Cadence CLI 注册一个 Domain,这里注册 Domain 的目的是将想要统一管理调度的任务放在同一个 Domain 中一起监控,这里要求 任务所挂载的 Domain 名称要和创建的 Domain 名称相符:
docker run --network=host --rm ubercadence/cli:master --do samples-domain domain register -rd 1
Domain samples-domain successfully registered.
此时可以通过访问 localhost:8088 并且输入定义好的 Domain 名称进入控制面板:
执行 Helloworld sample
首先创建 helloworld 的 workflow,并处于活跃状态,随时等待调用:
$ ./bin/helloworld -m worker
2019-12-21T16:11:54.874+0800 INFO common/sample_helper.go:65 Logger created.
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"}
2019-12-21T16:11:54.911+0800 INFO common/sample_helper.go:85 Domain successfully registered. {"Domain": "samples-domain"}
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"}
执行 helloworld 的 workflow:
$ ./bin/helloworld -m trigger
2019-12-21T16:12:37.836+0800 INFO common/sample_helper.go:65 Logger created.
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"}
2019-12-21T16:12:37.844+0800 INFO common/sample_helper.go:85 Domain successfully registered. {"Domain": "samples-domain"}
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"}
Other Samples
下面还有一些可以运行的示例,尝试运行并感受 cadence 充当了什么样的角色,同时他会在我们的方案中充当什么样的角色。
cron
./bin/cron -m worker
Start workflow with cron expression scheduled to run every minute.
./bin/cron -m trigger -cron "* * * * *"
dsl
./bin/dsl -m worker
./bin/dsl -m trigger -dslConfig cmd/samples/dsl/workflow1.yaml
./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
./bin/fileprocessing -m worker
./bin/fileprocessing -m trigger
recipes/branch
./bin/branch -m worker
Run branch workflow
./bin/branch -m trigger -c branch
Run parallel branch workflow
./bin/branch -m trigger -c parallel this will run the parallel branch workflow
recipes/choice
./bin/choice -m worker
Run the single choice workflow
./bin/choice -m trigger -c single
Run the multi choice workflow
./bin/choice -m trigger -c multi
greetings
./bin/greetings -m worker
./bin/greetings -m trigger
pickfirst
./bin/pickfirst -m worker
./bin/pickfirst -m trigger
mutex
./bin/mutex -m worker
./bin/mutex -m trigger
retryactivity
./bin/retryactivity -m worker
./bin/retryactivity -m trigger
splitmerge
./bin/splitmerge -m worker
./bin/splitmerge -m trigger
timer
./bin/timer -m worker
./bin/timer -m trigger
childworkflow
./bin/childworkflow -m worker
./bin/childworkflow -m trigger
dynamic
./bin/dynamic -m worker
./bin/dynamic -m trigger