OceaBase开发者大会落地上海!4月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:0013692

评论 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
回复
没有更多了
发现更多内容

科兴未来|“追光逐电 才聚紫琅”光电产业创新创业大赛

科兴未来News

创新引领!矩阵起源荣获中国信通院双重认可!

MatrixOrigin

数据库 分布式 云原生 超融合 矩阵起源

数码时代的奇迹:低代码开发助力数字经济的蓝海探索

快乐非自愿限量之名

人工智能 低代码 数字化 数字经济

实例分享| anyRTC 部署安徽某市应急实战指挥平台

anyRTC开发者

音视频 快对讲 融合会议 视频监控 综合调度

MatrixOne悲观事务实现

MatrixOrigin

数据库 分布式 云原生 矩阵起源

开源铸剑,五载匠心!Zilliz Cloud云服务盛装登场,引领向量数据库云时代!

Zilliz

阿里云 SaaS 云服务 Zilliz zillizcloud

HDC.Cloud 2023 |华为云5大开源项目发布与更新,助力开发者实现应用创新

华为云开源

开源 云原生 HDC.Cloud

Cloud Kernel SIG月度动态:ANCK 5.10-016将落地kABI机制,5.10-015版本规划发布

OpenAnolis小助手

操作系统 内核 anck 龙蜥sig 版本规划

浅谈如何向上管理

光毅

团队管理 向上管理

对象存储、数据库、NAS、标注数据集,均支持元信息配置|ModelWhale 版本更新

ModelWhale

人工智能 数据库 云计算 数据分析 大模型

2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。

福大大架构师每日一题

Go 算法 rust 福大大架构师每日一题

直播预告 | 博睿学院:海量数据实时可信认证

博睿数据

智能运维 博睿数据 数据要素 博睿学院

大学生活动社交小程序开发笔记(1)

CC同学

Docker学习路线2:底层技术

小万哥

Docker 程序员 容器 后端 开发

《面试1v1》开篇

JavaPub

Java redis elasticsearch 面试 计算机

GPT-4被破解!数智时代大突破!低代码开发平台揭秘:AI模型架构演进的利器

不在线第一只蜗牛

人工智能 低代码 模型调参 ChatGPT GPT-4

Boundless Hackathon @Stanford 主题黑客松活动闭幕,一文回顾

EOSdreamer111

重塑未来的1课:组装式交付新引擎——华为云智能化低代码平台

华为云PaaS服务小智

云计算 低代码 华为云 华为开发者大会

低代码技术分享官丨inBuilder使用有向无环图助力元数据工程依赖管理

inBuilder低代码平台

小程序开发这么简单,还需要App吗?

FinFish

小程序生态 APP开发 小程序开发

Boundless Hackathon @Stanford 主题黑客松活动闭幕,一文回顾

股市老人

es笔记六之聚合操作之指标聚合

Hunter熊

elasticsearch

软件测试/测试开发丨Selenium环境安装配置

测试人

Python 程序员 软件测试 selenium chromedriver

开启时空大数据新纪元:JNPF快速开发平台引领AI与自然资源融合

EquatorCoco

人工智能 AI 数据 时空大数据

昇腾AI创新大赛2023开发者套件创新赛道专题解读篇

彭飞

一个提高go开发效率的秘密武器,一天开发完成一个极简版社区后端服务

vison

crud gorm gin #go 代码自动生成

从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学

汀丶人工智能

人工智能 自然语言处理 nlp 知识图谱 本体建模

如果AI能帮我 | 社区征文

六月的雨在InfoQ

AIGC ChatGPT 年中技术盘点 通义听悟

接口文档阅读方法:程序员必备的技术指南

Liam

程序员 接口文档 API

从零开始构建一个电影知识图谱,实现KBQA智能问答[下篇]:Apache jena SPARQL endpoint及推理、KBQA问答Demo超详细教学

汀丶人工智能

人工智能 自然语言处理 知识图谱 智能问答 KBQA

分布式系统常见问题

互联网工科生

分布式

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