流程引擎/状态机简介以及选型
状态机
状态机就是一个对象状态流转的规则。包含:对象状态的枚举有哪些、状态相互流转的条件是什么。
对于一些简单状态的流转,我们直接用代码(如枚举+条件判断)实现即可,无需使用服务编排、流程引擎做管理。直接代码实现的适用场景是:适合状态数量少(<10个)、流转逻辑简单的场景。
流程引擎
随着业务的扩展,对象状态的流转可能会变得越来越复杂,传统if-else代码会变成「面条代码」,难以维护。
这时候就需要引入流程引擎来做维护,可以通过可视化的页面或者DSL清晰管理。
DSL是指Domain-Specific Language,领域特定语言,例如使用某个中间件,这个中间件自己定义的语法,就是DSL。这种就需要自己学习一套语法,有学习成本。
使用流程引擎的场景或者好处:
- 更清晰的维护复杂状态的流转。
- 能够对状态流转做持久化,并进行监控,可以有更方便的监控面板。
- 可以进行自动重试、超时处理、补偿操作等等。
- 业务规则常调整(如新增「预售审核」节点),用引擎可热更新流程定义,避免硬编码发布。
缺点的话就是:
- 学习成本高,需要学习一套中间件的DSL语法,以及运行的原理。
- 维护成本高,复杂的中间件需要发布应用,维护一个流程引擎应用,还需要维护对应的库表等等。
- 增加了耗时,流程引擎对于规则的解析、服务的编排等等,都是有一定的耗时的。
常用的流程引擎中间件有:
- Camunda开源版,官方文档:https://docs.camunda.org/manual/7.17/,中文文档:http://camunda-cn.shaochenfeng.com/introduction/
- Flowable,官方文档:https://www.flowable.org/Flowable6.3,中文文档:https://tkjohn.github.io/flowable-userguide/
- Temporal https://temporal.io/
- Conductor https://docs.conductor-oss.org/index.html Netflix开源的
- Snaker,轻量级组件,官网已经没了……项目地址:https://github.com/snakerflow-starter/snakerflow-spring-boot-starter
流程引擎选型对比
使用成本
- Camunda:中高,需要管理47张表,数据库管理
- Flowable:中,需要管理47张表,数据库管理,但是比Camunda简单
- Temporal:高,是分布式架构,需维护Cassandra/MySQL + Elasticsearch,运维复杂。
- Conductor:中,需管理数据库/Redis,但比Temporal简单。
- Snaker:低,没有依赖。
学习成本
- Camunda:中,历经考验,网上能找到很多文档学习。
- Flowable:中,历经考验,网上能找到很多文档学习。
- Temporal:高,国内使用的少,参考资料少;中文学习不友好,全是视频。
- Conductor:中高,国内使用的少,参考资料少。
- Snaker:中,简单,但是是社区维护。
分布式支持
- Camunda:支持嵌入式、容器内、独立部署。
- Flowable:支持嵌入式和独立部署。
- Temporal:独立部署。
- Conductor:独立部署。
- Snaker:嵌入式。
嵌入式说明:
容器内说明:
独立部署说明:
可视化支持
- Camunda:Camunda Modeler建模工具
- Flowable:类似Camunda,需要单独部署Modeler应用;也有IDE的插件。
- Temporal:有UI工具。
- Conductor:需要支持node14,然后自行在容器上安装UI。
- Snaker:支持图形化流程设计。
运行耗时
- Camunda:快,基于BPMN 2.0,解析XML有一定开销,但优化后性能尚可。
- Flowable:快,Camunda分支,优化了执行引擎,比Camunda稍快。
- Temporal: 慢(事件溯源有延迟),基于Event Sourcing,每次状态变更需持久化,但分布式扩展性强。
- Conductor: 快(依赖外部存储),任务调度依赖数据库,高负载时可能变慢。
- Snaker:最快,纯Java实现,无复杂BPMN解析,适合简单流程。
并发支持(独立部署情况下)
- Camunda:中,依赖DB锁。
- Flowable:中高,相比于Camunda,优化了锁机制。
- Temporal: 高,基于Cassandra/MySQL,横向扩展能力强,适合超大规模。
- Conductor: 高,基于Redis/Elasticsearch,任务分片能力强。
- Snaker:单机。
稳定性
- Camunda:高,企业级,久经考验。有版本灰度发布机制。
- Flowable:高,企业级,久经考验。有版本灰度发布机制。
- Temporal:极高,有自动故障恢复机制;有版本灰度发布。
- Conductor: 高,有版本灰度发布。
- Snaker:低,社区维护。
社区活跃度
- Camunda:高,企业维护,有付费版。
- Flowable:高,企业维护,有付费版,但是开源版维护不及时,主要维护付费版。
- Temporal: 中,企业维护,但是国内用的不多。
- Conductor: 中,企业维护,但是国内用的不多。
- Snaker:低,开源,无官网。