提到工作流,印象里都是 OA 系统各种请假审批流。事实上,广义上的工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。简单理解,我们为了实现某个业务目标,抽象拆解出来的一系列步骤及这些步骤之间的协作关系,就是工作流。例如订单发货流、程序构建流等。业界通常用 BPMN 流程图来描述一个工作流。
以实现一个用户购买逻辑为例,如果不应用工作流模型,我们串联多个任务(步骤)一般是通过显示的代码调用:
校验、支付、发货一气呵成,流畅自然。正喝着枸杞红枣,产品一脸笑意跑过来:“我们新搞个充会员卡的业务,大概步骤就校验 -> 推荐 -> 支付 -> 充值。校验和支付前面都做过了,应该很快实现吧?”
精通 if-else 的你,听完的瞬间就已经构思好了代码:
一通写下来,总感觉哪里不对,“为什么加新的任务节点,要改已有的代码呢?这不符合开闭原则啊!”。
工作流模型正是为了解决这类问题而生:分离任务的实现和任务的协作关系。上面同样的用户购物逻辑,有了工作流模型,各个任务只实现自己原子的逻辑,任务协作关系使用流程图来表达。
当新的逻辑需要复用已有任务节点时,只需要调整流程图,无需修改已有代码。
将任务实现与任务协作关系分离之后,就诞生了专门维护任务协作关系的程序 - 工作流引擎(也常称作流程引擎)。
其中最具有代表性的就非 Activiti 莫属了。在企业应用蓬勃发展的 21 世纪初,它几乎是实现流程自动化的标配。关于 Activiti 的介绍,网上已经有足够多的文章。今天我们要介绍是由 Activiti 的核心成员打造的另一款专为微服务编排而生的工作流引擎 - Zeebe。在开始之前,我们先理解下什么是微服务编排。
微服务架构的一大核心是把大的复杂的业务系统拆分成高内聚的微服务,每个服务负责相对独立的逻辑。例如一个电商系统,可能会拆分出支付微服务、订单微服务、仓储微服务、物流微服务等。服务拆分的好处无需赘述,但是要实现业务价值,不是看单个服务的能力,而是要协调所有服务保证企业端到端业务流的成功。
那么,哪个服务来负责端到端业务流的成功呢?答案是没有。事实上,在公司内,端到端的业务流可能都没有正式的文档说明,从一个微服务到另一个微服务的事件流转都是在代码里隐式表达的。
很多微服务架构依赖一种相对纯粹的编舞模式(choreography pattern)来解决这个问题。在这种模式下,微服务通过向一个消息队列发送和接收事件来相互协作。编舞模式给开发者提供了很高的灵活度,但是编舞模式仍不能解决:
于是便诞生了一种更严格的编排模式(orchestration pattern),用于协调各个微服务。在这种模式下,会有一个中控的引擎:
可以借用下面的图,来进一步理解微服务编排和微服务编舞模式的区别:
按照我们前面对工作流模型的阐述,工作流引擎很适合作为中控引擎,来编排调度微服务。那为什么诸如 Activiti 等传统的工作流引擎没能继续占领微服务编排的市场,而是诞生了新的微服务编排引擎-Zeebe?更有趣的是,Zeebe 的核心开发,也是来自最初的 Activiti 团队。
答案是诸如 Activiti 等传统工作流引擎的架构无法适应当下微服务的场景:
而 Zeebe 在设计之初,就考虑到了这些问题,下文来为大家详细介绍。
Zeebe 是专为微服务编排设计的免费开源的工作流引擎,它提供了:
Zeebe 设计之初,就考虑了超大规模的微服务编排问题。为了应对超大规模,Zeebe 支持:
Zeebe 架构主要包含 4 大组件:client, gateway, brokers 以及 exporters.
客户端向 Zeebe 发送指令:
客户端程序可以完全独立于 Zeebe 扩缩容,Zeebe brokers 不执行任何业务逻辑。客户端是嵌入到应用程序(执行业务逻辑的微服务)的库,用于跟 Zeebe 集群连接通信。客户端通过基于 HTTP/2 协议的 gRPC 与 Zeebe gateway 连接。
Zeebe 官方提供了 Java 和 Go 客户端。社区提供了 C#,Ruby,JavaScript 客户端实现。gRPC 协议很方便生成其他语言的客户端。
Client 中,执行单独任务的单元叫 JobWorker。
Gateway 作为 Zeebe 集群的入口,转发请求到 brokers。Gateway 是无状态(stateless)无会话(sessionless)的,可以按需增加节点,以负载均衡及高可用。
Broker 是分布式的流程引擎,维护运行中流程实例的状态。Brokers 可以分区以实现横向扩容、副本以实现容错。通常情况下,Zeebe 集群都不止一个节点。
需要重点强调的是,broker 不包含任何业务逻辑,它只负责:
Brokes 形成一个对等网络(peer-to-peer),这样集群不会有单点故障。集群中所有节点都承担相同的职责,所以一个节点不可用后,节点的任务会被透明的重新分配到网络中其他节点。
Exporter 系统提供 Zeebe 内状态变化的事件流。这些事件流数据有很多潜在用处,包括但不限于:
Exporter 提供了简洁的 API,可以流式导出数据到任何存储系统。Zeebe 官方提供开箱即用的 Elasticsearch exporter,社区也提供了其他 Exporters。
领取专属 10元无门槛券
私享最新 技术干货