一种实用的Temporal 架构方法

2020 年 11 月 16 日

一种实用的Temporal 架构方法

本文最初发布于 Mikhail Shilkov 的个人博客,经原作者授权由 InfoQ 中文站翻译并分享。


Temporal让开发人员可以构建高度可靠的应用程序,而无需担心所有的边界情况。如果你刚开始接触 Temporal,那么可以读一下我的文章《开源工作流即代码》。接下来,我将介绍如何安装和运行 Temporal。


Temporal 包含多个组件。在本文中,我想概要地介绍下其主要的构建模块及它们之间的交互。最终,你将对 Temporal 以及部署到开发环境、过渡环境和生产环境的注意事项有一个总体了解。


Workers


Workers 是运行 Temporal 应用程序代码的计算节点。你将工作流程和活动编译为可执行的 workers。接下来,你可以在后台运行 worker 的可执行文件,它将侦听需要处理的新任务。


你的第一个开发环境可能只需要一个 wokrer,在单个进程中同时运行工作流和活动。worker 可以托管在你希望的任何地方:可以作为笔记本电脑上的本地进程,也可以作为 AWS Fargate 任务,可以是 Kubernetes 中的 pod,等等。



Temporal worker 执行工作流和活动


生产部署通常运行大量负载较大的工作流,因此,你可能需要并行运行多个工作者。确保节点分布在一个计算集群上,从而实现弹性和可伸缩性。



工作负载扩展到多个 Temporal workers


Workers 独立操作,每一个负责处理各自的负载。从逻辑上讲,Workers 是“无状态的”:它们不关心过去和未来。Workers 之间不直接通信,但它们通过一个 Temporal 中央服务——系统的大脑——进行协调。


Temporal 服务


Temporal 服务是 Temporal 提供的一个组件。它的目的是跟踪工作流、活动和任务,并协调工作者的执行。


你的早期环境可能只有一个在后台运行的服务实例。worker 知道服务的域名(IP)和端口,并通过 gRPC 连接到服务。



Worker 与 Temporal 服务交互


Temporal 服务本身由多个组件组成:前端、匹配、历史记录等。不过现在,我们可以将其视为黑盒“服务”。


一旦工作负载开始增加,就需要将服务组件扩展到多个实例,以获得高弹性和高吞吐量。因此,现在有多个 workers 在与多个服务实例对话。



运行多个组件的 Temporal 集群


Temporal 服务可以容忍节点故障,因为它将其状态存储在外部存储器中。


数据存储


所有工作流数据——任务队列、执行状态、活动日志——都存储在一个持久化数据存储中。持久性技术是可插拔的,目前官方支持两个选项:Cassandra 和 MySQL。更多的可选方案,包括 PostgreSQL,正在开发之中。


MySQL 数据库补全了最简单的 Temporal 部署图。



MySQL 作为 Temporal 的数据存储


对于会遇到高负载的高度分布式应用程序,使用 Cassandra 可能更好。这个数据库可以是你自己管理的集群,也可以是托管的云服务(比如 Azure Cosmos DB):



Cassandra 作为 Temporal 的数据存储


你的代码永远不会直接与数据存储交互。基本上,它是 Temporal 服务的一个(相当重要的)实现细节。


Temporal Web 控制台


Temporal 提供了一个方便的 Web 控制台来查看命名空间、工作流和活动历史。从技术上讲,它不是必备组件——但是你可能希望使用它手动检查和排除故障。


你可能有其他客户端组件,举例来说,来启动工作流执行。


外部客户端


你需要一个客户端来启动你的第一个工作流执行。它可以是 Temporal 命令行接口tctl,也可以在使用 SDK 或原始 gRPC 编写的任何自定义代码中通过调用发起一个工作流。


每个客户端都必须连接到一个 Temporal 服务,以启动或终止工作流、等待完成、列出历史记录里的结果,等等。例如,Web 应用程序可以在每次处理特定 HTTP 端点时启动工作流执行。


合而为一


下图将上面提到的所有部分组合在一起。



Temporal 高层架构


如你所见,要使 Temporal 工作起来需要相当多的组件。Temporal 设计用于可靠地处理数以百万计的工作流,并提供高性能保证,同时,它还是开源的,可以在不同的基础设施选项之间移植。这就要求使用多层方法。


你可以根据入门指南将所有内容部署到开发机器上。然后,你可以将组件移到你喜欢的云环境中。


原文链接:


https://mikhail.io/2020/10/practical-approach-to-temporal-architecture/

2020 年 11 月 16 日 15:05 737
用户头像

发布了 307 篇内容, 共 136.2 次阅读, 收获喜欢 628 次。

关注

评论

发布
暂无评论
发现更多内容

阿里年薪百万的P7架构师简历都长什么样?他们都是怎么学习的?

周老师

Java 编程 程序员 架构 面试

阿里P8Java架构师呕心沥血整理出来的[史上最全Java面试题精选集锦]

Java成神之路

Java 编程 程序员 面试

[翻译]The Go scheduler[Go调度]

卓丁

golang golang调度 Go scheduler

阿里P8忠告:这些技术,哪怕不用微服务架构,你也应该会

小Q

Docker 架构 微服务 springboot SpringCloud

20张图,大学四年都没整明白的操作系统就这么学会了

小Q

Java 程序员 架构 操作系统

工作好多年有可能还未真正了解接口和抽象类

架构师修行之路

接口 抽象

架构师训练营 - 第 8周命题作业

红了哟

大厂面试题:集群部署时的分布式 session 如何实现? 面试官心理分析

老大哥

Java 程序员 后端

XSKY ClickHouse如何实现存算分离

XSKY融合存储

筹备半年时间,四面阿里终于如愿拿到P7级offer【Java岗】。

Java成神之路

Java 编程 程序员 面试

未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

程序员内点事

RabbitMQ java; mqtt

架构师训练营作业(大数据与机器学习)

qihuajun

面试官为什么会问你,如何设计一个高并发系统?

老大哥

Java 程序员 后端

一步搞定任意圆角背景

mengxn

android xml 圆角

用技术的“信条”,开启AI to B的产业位移

脑极体

架构师第十三周作业

傻傻的帅

架构师

【真实面试经历】我和阿里面试官的一次“邂逅”

老大哥

Redis 哨兵模式

是老郭啊

redis redis哨兵模式 redis哨兵 redis哨兵集群

当心这些“坑”!阿里云服务器部署前后端分离项目

麦叔

nginx 前后端分离 跨域

甲方日常10

大橘子

工作 随笔杂谈 日常

“新基建”与“双循环”的二重奏:2020服贸会靠什么推动经济复苏

脑极体

LeetCode题解:225. 用队列实现栈,两个队列,压入 -O(1), 弹出 -O(n),JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

Polkadot初识,不止于跨链

QTech

polkadot 跨链

市值做市机器人,操盘做市系统搭建

13823153121

从用户输入手机验证码开始

架构师修行之路

[翻译]Go Concurrency Patterns[Go 并发模式]

卓丁

golang Rob Pike Go Concurrency Patterns Concurrency

Flink通过官网创建自己的工程-20

小知识点

scala 大数据 flink

合约跟单app,永续合约交易所带单交易软件

13823153121

边缘计算,如何啃下集群管理这块硬骨头?

博云技术社区

云计算 容器 边缘计算 PaaS 博云

呕心沥血,整理200+最新面试题,面试之前看一下,事半功倍

小Q

Java 学习 程序员 架构 面试

indexOf原理,Java,javascript,python实现

叫练

算法

微服务治理平台化探索

微服务治理平台化探索

一种实用的Temporal 架构方法-InfoQ