Skip to content

流程管理器 (SAGA、Process Manager)

用一个对象负责管理一个长业务流程的执行,这个对象就被叫做流程管理器(Process Manager, SAGA)。

SAGA这个词到底是什么意思?

Saga 这个词,源自于古斯堪的那维亚语,是长篇故事的意思,被用作计算机词汇,是源自于Hector Garcaa-Molrna 和 Kenneth Salem 在1987年发布的论文SAGAS

什么样的业务流程算作长业务流程?

长业务流程有以下特征:

  • 多本地事务:由很多本地数据库事务组成,而不是在一次数据库事务中完成整个流程
  • 可暂停:流程可能被阻塞、暂停,持久化,等条件满足时继续执行
  • 耗时长:事件跨度上从数秒到数天,甚至数月数年

举个例子来说,一个审批流程,进入到某个等待人工审核的状态后,这个流程对象不能一直存放在内存中了。因此系统并不知道审批人什么时候会去做审核动作,可能几分钟,也可以几小时之后才会去审批。把这个流程对象一直放在内存中,就是浪费内存。而且如果这个时候发生断点,数据丢失,就没有人知道有一个流程在执行中了,因此必须持久化它。这样的流程就是典型的长业务流程。

相反,某个函数的执行过程,就不是长业务流程。

流程管理器是必须建模出来的吗?

不是。并不是所有业务场景都有长流程需要被建模表达出来。

什么情况下要建模流程管理器?

业务中存在这样的长流程,需要明确的表达出来的时候,才把它建模出来。表达长业务流程,有两种办法

  • 编制(orchestration) 集中的让一个对象负责去协调流程,这个对象就是流程管理器
  • 编排(choreography)分散的多个业务对象间的协作,最终恰好完成了流程

前者更直观,后者更灵活。当需要前者的时候,就要设计流程管理器。

流程管理器是不是一个聚合?

如果需要自己实现,那么它是一个聚合。它承担了推动某个具体流程执行,直到某个稳定状态的职责。它有自己的id,有状态变化。

不过有的时候,我们并不会直接用你代码去实现这样的流程,而是借助于流程引擎,这个时候,等于由外部系统去负责实现它了,自然就不在我们的问题域了,也就不需要标记它是一个聚合了。

用BPM和和用流程管理器有什么区别?

BPM是一个更标准化的专业的流程工具,它可以定义、执行、管理流程。如果采用了BPM引擎去执行长流程,就不需要我们自己去编写流程管理器了。

对于简单场景,采用BPM引擎会给系统引入复杂性,可能还没有直接编码来得成本低。但是对于流程特别多,又经常变动的场景,专业的BPM引擎,则能更低成本的应对这样的需求。