免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

一文读懂微服务编排利器—Zeebe

  • 2021-08-02
  • 本文字数:3478 字

    阅读完需:约 11 分钟

一文读懂微服务编排利器—Zeebe

一、工作流与微服务编排

1. 工作流


提到工作流,印象里都是 OA 系统各种请假审批流。事实上,广义上的工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。简单理解,我们为了实现某个业务目标,抽象拆解出来的一系列步骤及这些步骤之间的协作关系,就是工作流。例如订单发货流、程序构建流等。业界通常用 BPMN 流程图来描述一个工作流。


(1)没有工作流时的任务协作


以实现一个用户购买逻辑为例,如果不应用工作流模型,我们串联多个任务(步骤)一般是通过显示的代码调用:



校验、支付、发货一气呵成,流畅自然。正喝着枸杞红枣,产品一脸笑意跑过来:“我们新搞个充会员卡的业务,大概步骤就校验 -> 推荐 -> 支付 -> 充值。校验和支付前面都做过了,应该很快实现吧?”

精通 if-else 的你,听完的瞬间就已经构思好了代码:



一通写下来,总感觉哪里不对,“为什么加新的任务节点,要改已有的代码呢?这不符合开闭原则啊!”。


(2)应用工作流模型的任务协作


工作流模型正是为了解决这类问题而生:分离任务的实现和任务的协作关系。上面同样的用户购物逻辑,有了工作流模型,各个任务只实现自己原子的逻辑,任务协作关系使用流程图来表达。



当新的逻辑需要复用已有任务节点时,只需要调整流程图,无需修改已有代码。



2. 工作流引擎


将任务实现与任务协作关系分离之后,就诞生了专门维护任务协作关系的程序 - 工作流引擎(也常称作流程引擎)。



其中最具有代表性的就非 Activiti 莫属了。在企业应用蓬勃发展的 21 世纪初,它几乎是实现流程自动化的标配。关于 Activiti 的介绍,网上已经有足够多的文章。今天我们要介绍是由 Activiti 的核心成员打造的另一款专为微服务编排而生的工作流引擎 -  Zeebe。在开始之前,我们先理解下什么是微服务编排。


3. 微服务编排


微服务架构的一大核心是把大的复杂的业务系统拆分成高内聚的微服务,每个服务负责相对独立的逻辑。例如一个电商系统,可能会拆分出支付微服务、订单微服务、仓储微服务、物流微服务等。服务拆分的好处无需赘述,但是要实现业务价值,不是看单个服务的能力,而是要协调所有服务保证企业端到端业务流的成功。


那么,哪个服务来负责端到端业务流的成功呢?答案是没有。事实上,在公司内,端到端的业务流可能都没有正式的文档说明,从一个微服务到另一个微服务的事件流转都是在代码里隐式表达的。

    

很多微服务架构依赖一种相对纯粹的编舞模式(choreography pattern)来解决这个问题。在这种模式下,微服务通过向一个消息队列发送和接收事件来相互协作。编舞模式给开发者提供了很高的灵活度,但是编舞模式仍不能解决:


  • 可见性:多少端到端业务流正在运行中,它们的状态是什么样子。过去 24 小时,有多少业务流实例没有成功结束?为什么这些业务流实例没有成功结束?一个业务流或者某个任务完成的平均时间是多少?

  • 异常处理:如果业务流里有一个微服务失败,谁负责处理这个异常?业务流的重试逻辑是怎么样的?如果需要人工介入,问题的升级处理规则是怎么样的?


于是便诞生了一种更严格的编排模式(orchestration pattern),用于协调各个微服务。在这种模式下,会有一个中控的引擎:


  • 按照业务逻辑的蓝图,编排各个微服务的调用关系;

  • 监控整个业务流的状态;

  • 提供自动化的机制处理单个服务的失败,保证整个业务流的成功。


可以借用下面的图,来进一步理解微服务编排和微服务编舞模式的区别:



按照我们前面对工作流模型的阐述,工作流引擎很适合作为中控引擎,来编排调度微服务。那为什么诸如 Activiti 等传统的工作流引擎没能继续占领微服务编排的市场,而是诞生了新的微服务编排引擎-Zeebe?更有趣的是,Zeebe 的核心开发,也是来自最初的 Activiti 团队。


答案是诸如 Activiti 等传统工作流引擎的架构无法适应当下微服务的场景:


  • 传统的工作流引擎,编排的大部分是人工审批任务,意味着任务流转效率低,系统吞吐低。而当下微服务大部分是程序化的自动任务,意味着任务高效流转,系统吞吐高。单点架构、同步响应、高度依赖 DB 的 Activiti,显然支撑不了这样的场景。

  • Activiti 等工作流引擎,通常都以 jar 包的形式,嵌入到业务程序中,直接通过调用本地方法的方式调度起业务 TaskHandler。在单体架构下,这种集成方式简单易用。但是在微服务架构下,工作流的任务往往是分布在多个服务的,而且同一个服务往往还会根据负载情况部署不同数量的实例。如果还是采用引擎主动调用的方式,怎么寻址到具体的 TaskHandler?当后端业务服务处理能力本身是瓶颈的时候,如果引擎还是不断的调用,只会进一步压垮服务。



而 Zeebe 在设计之初,就考虑到了这些问题,下文来为大家详细介绍。


二、Zeebe 特性与顶层架构

1. Zeebe 核心特性


Zeebe 是专为微服务编排设计的免费开源的工作流引擎,它提供了:


  • 可见性(visibility):Zeebe 提供能力展示出企业工作流运行状态,包括当前运行中的工作流数量、平均耗时、工作流当前的故障和错误等;

  • 工作流编排(workflow orchestration):基于工作流的当前状态,Zeebe 以事件的形式发布指令(command),这些指令可以被一个或多个微服务消费,确保工作流任务可以按预先的定义流转;

  • 监控超时(monitoring for timeouts)或其他流程错误:同时提供能力配置错误处理方式,比如有状态的重试或者升级给运维团队手动处理,确保工作流总是能按计划完成。


Zeebe 设计之初,就考虑了超大规模的微服务编排问题。为了应对超大规模,Zeebe 支持:


  • 横向扩容(horizontal scalability):Zeebe 支持横向扩容并且不依赖外部的数据库,相反的,Zeebe 直接把数据写到所部署节点的文件系统里,然后在集群内分布式的计算处理,实现高吞吐;

  • 容错(fault tolerance):通过简单配置化的副本机制,确保 Zeebe 能从软硬件故障中快速恢复,并且不会有数据丢失;

  • 消息驱动架构(message-driven architecture):所有工作流相关事件被写到只追加写的日志(append-only log)里;

  • 发布-订阅交互模式(publish-subscribe interaction model):可以保证连接到 Zeebe 的微服务根据实际的处理能力,自主的消费事件执行任务,同时提供平滑流量和背压的机制;

  • BPMN2.0 标准(Visual workflows modeled in ISO-standard BPMN 2.0):保证开发和业务能够使用相同的语言协作设计工作流;

  • 语言无关的客户端模型(language-agnostic client model):可以使用任何编程语言构建 Zeebe 客户端。


2. Zeebe 架构


Zeebe 架构主要包含 4 大组件:client, gateway, brokers 以及 exporters.



1)Client


客户端向 Zeebe 发送指令:


  • 发布工作流(deploy workflows)

  • 执行业务逻辑(carry out business logic)

  • 创建工作流实例(start workflow instances)

    发布消息(publish messages)

    激活任务(activate jobs)

    完成任务(complete jobs)

    失败任务(fail jobs)

  • 处理运维问题(handle operational issues)

  • 更新实例流程变量(update workflow instance variables)

  • 解决异常(resolve incidents)


客户端程序可以完全独立于 Zeebe 扩缩容,Zeebe brokers 不执行任何业务逻辑。客户端是嵌入到应用程序(执行业务逻辑的微服务)的库,用于跟 Zeebe 集群连接通信。客户端通过基于 HTTP/2 协议的 gRPC 与 Zeebe gateway 连接。


Zeebe 官方提供了 Java 和 Go 客户端。社区提供了 C#,Ruby,JavaScript 客户端实现。gRPC 协议很方便生成其他语言的客户端。


Client 中,执行单独任务的单元叫 JobWorker。


(2)Gateway


Gateway 作为 Zeebe 集群的入口,转发请求到 brokers。Gateway 是无状态(stateless)无会话(sessionless)的,可以按需增加节点,以负载均衡及高可用。


(3)Broker


Broker 是分布式的流程引擎,维护运行中流程实例的状态。Brokers 可以分区以实现横向扩容、副本以实现容错。通常情况下,Zeebe 集群都不止一个节点。


需要重点强调的是,broker 不包含任何业务逻辑,它只负责:


  • 处理客户端发送的指令

  • 存储和管理运行中流程实例的状态

  • 分配任务给 job workers


Brokes 形成一个对等网络(peer-to-peer),这样集群不会有单点故障。集群中所有节点都承担相同的职责,所以一个节点不可用后,节点的任务会被透明的重新分配到网络中其他节点。


(4)Exporter


Exporter 系统提供 Zeebe 内状态变化的事件流。这些事件流数据有很多潜在用处,包括但不限于:


  • 监控当前运行流程实例的状态

  • 分析历史的工作流数据以做审计或 BI

  • 跟踪 Zeebe 抛出的异常(incident)


Exporter 提供了简洁的 API,可以流式导出数据到任何存储系统。Zeebe 官方提供开箱即用的 Elasticsearch exporter,社区也提供了其他 Exporters。



头图:Unsplash

作者:唐炯

原文:https://mp.weixin.qq.com/s/tV4TBAUMY836fNmjrh9rGQ

原文:一文读懂微服务编排利器—Zeebe

来源:云加社区 - 微信公众号 [ID:QcloudCommunity]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-08-02 12:0014876

评论 5 条评论

发布
用户头像
推荐低代码服务编排库 Commander
https://xie.infoq.cn/article/1adf7327403affd58aadb67a4
2022-03-26 00:18
回复
用户头像
k8s基本已经全面产业化了,为什么还需要zeebe。而且zeebe的对比对象也不应该是activiti,而而应该是k8s或者docker自带的那个吧。activiti对比的应该是jbpm呀
2021-08-12 14:42
回复
zeebe主打的微服务编排,不是说编排微服务实例/容器的创建、调度、销毁,而是编排多个微服务的多个接口。文章摘录过来被截断了,可以看下微信公众号原文~
2021-09-26 21:11
回复
用户头像
Sorry, 没能通过此文读懂为啥zeebe是微服务编排利器,辜负了作者的期望。
2021-08-08 11:44
回复
文章摘录过来被截断了,可以看下微信公众号原文~
2021-09-26 21:11
回复
没有更多了
发现更多内容

手写JavaScript常见5种设计模式

helloworld1024fd

JavaScript

嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)

矜辰所致

Linux Shell shell脚本编程 10月月更

华为云弹性公网IP服务,为企业敲开互联网大门

清欢科技

现代农业|AIRIOT智慧农业管理解决方案

AIRIOT

低代码 物联网 智慧农业

快被Gartner捧上天的Data Fabric数据经纬到底是个啥?

雨果

Data Fabric 数据经纬

浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400

OpenHarmony开发者

OpenHarmony

华为云全球加速GA,助跨境企业云上业务通达

清欢科技

全局图优化:提升 MegEngine 模型推理性能的又一神器

MegEngineBot

深度学习 开源 性能优化 MegEngine 全局图优化

【限量招募30人】免费参与SPSS云版本内测

淋雨

SPSS

高可用系统哪家靠谱?工作原理是什么?

行云管家

高可用 高可用架构 高可用集群

凭什么 31x31 大小卷积核的耗时可以和 9x9 卷积差不多?| 文末附 meetup 回顾

MegEngineBot

深度学习 开源 卷积 MegEngine

开启自然资源管理“智绘”之路!

天翼云开发者社区

智慧城市、数字政府、城市大脑、一网统管之间有什么关系

雨果

智慧城市 城市大脑 数字政府 一网统管

前端二面手写面试题总结

helloworld1024fd

JavaScript

永久免费低代码开发平台有哪些?

优秀

低代码 低代码开发平台

MetaForce佛萨奇魔豹2.0系统开发技术讲解方案

I8O28578624

基于 MinIO 部署单实例 Databend | 新手篇(1)

Databend

天翼云推出全栈政务混合云支持私有化运行

天翼云开发者社区

华为云全球加速GA,让企业获得更优质的服务体验

清欢科技

哪里有便宜的云服务器?可以下月付款吗?

行云管家

云计算 服务器 云服务器

项目实战:在线报价采购系统(React +SpreadJS+Echarts)

葡萄城技术团队

React 项目实战 采购软件 echart

Pytorch、CUDA和cuDNN的安装图文详解win11(解决版本匹配问题)

timerring

PyTorch cuda 10月月更 cudnn

SAP | 消息 MESSAGE

暮春零贰

SAP 消息 10月月更

2022年中国篮球内容消费趋势洞察

易观分析

消费 篮球

落地DataOps,必须克服的挑战有哪些?

雨果

DataOps

手写现代前端框架diff算法-前端面试进阶

helloworld1024fd

JavaScript

场景金融持续引发行业关注,4.0时代打造金融服务新生态

易观分析

银行 场景金融

浅谈Mixin、Composition API、Reactive API、Ref API以及readonly🔥

渔戈

前端 Vue3 10月月更

「聚变」前端 & 客户端 | 第十七届 D2 终端技术大会,来了

阿里巴巴终端技术

阿里巴巴 前端 移动端 客户端 D2

华为云全球加速GA,助力中小企业突破发展瓶颈!

清欢科技

千锋1024程序员节大咖讲师技术直播火力全开

千锋IT教育

一文读懂微服务编排利器—Zeebe_架构_云加社区_InfoQ精选文章