简介
基于 Workflow 的实现,与常规 Yarn/Spark 这类不同,该框架并非用于处理大数据量请求,更多的关注在 Workflow 这种轻量级的事务、扩展、容灾等特性上。由此衍生出一系列核心组件,更多可参考 Designing A Workflow Engine from First Principles 内容。
Temporal 集群的核心包括了:任务队列、定时器、状态转换、事务性更新。
示例
部署环境可从 Docker Compose 获取,默认使用 ES、PG 等,这里简单只使用 MySQL 作为存储,通过如下命令启动即可,此时会启动 http://127.0.0.1:8080 作为 WebUI 使用,而 127.0.0.1:7233
用于 SDK 连接。
----- 启动基于MySQL的存储
# docker compose -f docker-compose-mysql.yml up -d
----- 执行基础的命令
# alias tctl="docker exec temporal-admin-tools tctl"
# tctl workflow list
很多示例可以参考 Sample GoLang 中的使用方式,例如 HelloWorld 的代码。
架构
Frontend
采用 Sharding 之后,可以采用胖客户端 (FatClient) 来维护集群信息,这样客户端的成本会比较高,而且有实现的变化就需要同时升级客户端。所以,当前通过 FrontEnd 来处理请求,核心是请求的路由转发。
Worker
其中包含了通过 Rust 开发的 SDK-Core 以及在其基础上不同语言的封装。
其它
Transactional Outbox
一种简单的设计模式,通常用于数据库+消息队列这种场景,本质上是分布式事务的处理,但是考虑到很多消息队列并不支持类似 2PC 的分布式事务接口,所以,是通过完全依赖数据库的方式进行解决。
简单来说,在数据库中同时增加一张 Outbox 的表,在更新业务数据同时事务级刷新该表,同时通过另外的服务拉取 Outbox 数据,并同步到消息队列,当然也可以通过 CDC 的方式同步数据。
不过这里同时需要处理可能出现的消息重复问题。
参考
- Docs 官方仓库中的文档,有很多流程图、架构的基本设计,例如 Workflow Lifecycles 。
- RingPop 分布式系统中的任务调度 SDK 实现。