工作流引擎在vivo營(yíng)銷(xiāo)自動(dòng)化中的應(yīng)用實(shí)踐 | 引擎篇03

作者:vivo 互聯(lián)網(wǎng)服務(wù)器團(tuán)隊(duì)- Cheng Wangrong

本文是《vivo營(yíng)銷(xiāo)自動(dòng)化技術(shù)解密》的第4篇文章,分析了在營(yíng)銷(xiāo)自動(dòng)化業(yè)務(wù)引入工作流技術(shù)的背景和工作流引擎的介紹,同時(shí)介紹了幾種業(yè)界流行的開(kāi)源工作流引擎特點(diǎn),以及在項(xiàng)目自研開(kāi)發(fā)過(guò)程中的設(shè)計(jì)思路和總結(jié)思考。

《vivo營(yíng)銷(xiāo)自動(dòng)化技術(shù)解密》系列文章:

vivo營(yíng)銷(xiāo)自動(dòng)化技術(shù)解密|開(kāi)篇

設(shè)計(jì)模式如何提升 vivo 營(yíng)銷(xiāo)自動(dòng)化業(yè)務(wù)擴(kuò)展性 | 引擎篇01

狀態(tài)機(jī)引擎在vivo營(yíng)銷(xiāo)自動(dòng)化中的深度實(shí)踐 | 引擎篇02

一、業(yè)務(wù)背景

營(yíng)銷(xiāo)自動(dòng)化平臺(tái)可以支持不同用戶生命周期的活動(dòng)旅程策略配置 ,根據(jù)用戶觸發(fā)的不同活動(dòng)行為,進(jìn)行差異化的營(yíng)銷(xiāo)觸達(dá)方案。同時(shí)各種類(lèi)型活動(dòng)的具體執(zhí)行過(guò)程中也有不同的業(yè)務(wù)處理流程(比如審批流程和業(yè)務(wù)流轉(zhuǎn))。

業(yè)務(wù)流程復(fù)雜多樣,需求變更頻繁,項(xiàng)目開(kāi)發(fā)過(guò)程中會(huì)有以下痛點(diǎn):

  1. 項(xiàng)目交付周期長(zhǎng):一個(gè)完整的業(yè)務(wù)流程需要從頭開(kāi)始按版本迭代,開(kāi)發(fā)時(shí)間長(zhǎng),成本高。
  2. 功能重復(fù)開(kāi)發(fā)測(cè)試:業(yè)務(wù)之間會(huì)摻雜著很多共性的流程,導(dǎo)致大量重復(fù)性開(kāi)發(fā)測(cè)試工作,效率低。
  3. 維護(hù)成本高:隨著項(xiàng)目業(yè)務(wù)的逐步發(fā)展,業(yè)務(wù)流程逐步積累,可維護(hù)性下降,系統(tǒng)改動(dòng)牽一發(fā)而動(dòng)全身。

如何將業(yè)務(wù)邏輯從控制流中剝離出來(lái),讓產(chǎn)研人員更聚焦于業(yè)務(wù)的實(shí)現(xiàn)是需要重點(diǎn)解決的問(wèn)題。而傳統(tǒng)OA領(lǐng)域使用的是久經(jīng)考驗(yàn)的業(yè)務(wù)流程管理解決方案 —— 工作流(Workflow)。工作流是一套工業(yè)級(jí)的解決方案,由工作流管理聯(lián)盟(WfMC)制定了一系列的標(biāo)準(zhǔn)。

二、工作流介紹

2.1 工作流定義

工作流(Workflow)—— 對(duì)工作流程及其各操作步驟之間業(yè)務(wù)規(guī)則的抽象,將流程中的工作組織邏輯和規(guī)則進(jìn)行建模,交由計(jì)算機(jī)進(jìn)行自動(dòng)處理。

工作流的本質(zhì)思想是:通過(guò)預(yù)定義的工作流程模板,對(duì)現(xiàn)實(shí)活動(dòng)進(jìn)行實(shí)例化的過(guò)程。簡(jiǎn)單說(shuō)就是通過(guò)預(yù)設(shè)的格式或者可視化配置好流程的模板(比如一種分享活動(dòng)的運(yùn)行流程模板),使用時(shí)通過(guò)該模板構(gòu)造出一個(gè)流程實(shí)例對(duì)象,通過(guò)實(shí)例對(duì)象完成活動(dòng)運(yùn)行跟蹤和回溯。

2.2 工作流參考模型

WfMC工作流管理聯(lián)盟為工作流制定了參考模型,其核心就是中間的工作流引擎,工作流引擎提供流程定義工具(接口1)、給使用者提供信息查詢(xún)(接口2)、調(diào)用外部應(yīng)用(接口3)、整合其他工作流(接口4)和監(jiān)控管理(接口5)的能力。 對(duì)于大多數(shù)工作流產(chǎn)品而言,重點(diǎn)關(guān)注的是接口1和接口2的實(shí)現(xiàn)。

2.3 工作流引擎關(guān)鍵特性

  • 流程可視化

提供可視化的流程搭建,流程視圖查看能力,以及實(shí)時(shí)觀測(cè)任務(wù)運(yùn)行能力。

  • 業(yè)務(wù)可編排復(fù)用

將公共業(yè)務(wù)進(jìn)行組件化,可以支持任務(wù)的自由編排,自由搭建出適合的業(yè)務(wù)的不同流程。

  • 業(yè)務(wù)和控制分離

將流程的控制(如流轉(zhuǎn)、判斷、循環(huán)、重試等)的任務(wù)交由工作流負(fù)責(zé),讓使用者聚焦于核心業(yè)務(wù)邏輯。

2.4 工作流引擎的類(lèi)型

對(duì)于工作流的類(lèi)型沒(méi)有專(zhuān)門(mén)的標(biāo)準(zhǔn),按照流程任務(wù)節(jié)點(diǎn)特性可以分為:

  • 順序工作流

順序工作流的運(yùn)行方式類(lèi)似一種特定的流程圖,上一個(gè)流程任務(wù)完成后依次進(jìn)入下一個(gè)流程任務(wù),過(guò)程不可逆。

  • 狀態(tài)機(jī)工作流

狀態(tài)機(jī)工作流側(cè)重關(guān)注的是流程任務(wù)的狀態(tài),驅(qū)使任務(wù)狀態(tài)發(fā)生變化的因素一般為外部事件,即事件驅(qū)動(dòng)的方式,驅(qū)使任務(wù)節(jié)點(diǎn)從一個(gè)狀態(tài)運(yùn)行到另外一個(gè)狀態(tài),節(jié)點(diǎn)間可逆。


  • 規(guī)則驅(qū)動(dòng)工作流

側(cè)重于節(jié)點(diǎn)的運(yùn)轉(zhuǎn)規(guī)則,基于業(yè)務(wù)規(guī)則進(jìn)行工作流程的執(zhí)行,在處理具有明確目標(biāo)但“規(guī)則”或規(guī)范級(jí)別不同的各種項(xiàng)目時(shí),規(guī)則驅(qū)動(dòng)的工作流非常有用。


可以看到不同類(lèi)型的工作流不是完全割裂的,狀態(tài)機(jī)工作流中也可以結(jié)合著條件和規(guī)則進(jìn)行操作節(jié)點(diǎn)轉(zhuǎn)換的過(guò)程。在軟件開(kāi)發(fā)中,一般會(huì)考慮結(jié)合狀態(tài)機(jī)和規(guī)則驅(qū)動(dòng)的工作流。

2.5 工作流引擎和狀態(tài)機(jī)的差異

在之前的文章里面,我們有對(duì)狀態(tài)機(jī)和工作流引擎做過(guò)一次簡(jiǎn)單的對(duì)比,事實(shí)上,兩者之間并不是一個(gè)完全對(duì)等的概念:

  • 狀態(tài)機(jī)是系統(tǒng)狀態(tài)以及這些狀態(tài)之間轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)計(jì)算模型,而工作流是對(duì)整體工作流程及其各操作步驟之間業(yè)務(wù)邏輯和規(guī)則的抽象建模。
  • 狀態(tài)機(jī)模式是事件驅(qū)動(dòng)型,大多通過(guò)外部事件觸發(fā)狀態(tài)的自動(dòng)流轉(zhuǎn);工作流引擎更側(cè)重于描述預(yù)定義流程任務(wù)完成之后的自動(dòng)流轉(zhuǎn),可預(yù)測(cè)性會(huì)更強(qiáng)。
  • 從適用場(chǎng)景的復(fù)雜性上看,直接使用狀態(tài)機(jī)的方式可以清晰地描繪出所有可能的狀態(tài)以及導(dǎo)致轉(zhuǎn)換的事件,適用于解決單維度、復(fù)雜度不高的業(yè)務(wù)問(wèn)題,發(fā)揮靈活輕便的特點(diǎn);工作流引擎則更適合復(fù)雜的業(yè)務(wù)流程管理,解決如大型CRM復(fù)雜度更高的流程自動(dòng)化問(wèn)題,聚焦于改善整體業(yè)務(wù)流程的效率。
  • 工作流引擎是可以在狀態(tài)機(jī)的結(jié)構(gòu)模型基礎(chǔ)上進(jìn)行構(gòu)建,事實(shí)上很多開(kāi)源的工作流引擎也都是基于狀態(tài)機(jī)的實(shí)現(xiàn)方式。

了解了工作流的基本特點(diǎn)和使用場(chǎng)景之后,我們來(lái)看一下比較流行的開(kāi)源工作流引擎。

三、開(kāi)源工作流引擎

四、工作流引擎自研設(shè)計(jì)

4.1 使用開(kāi)源工作流引擎的問(wèn)題

  • 開(kāi)源工作流最大的優(yōu)勢(shì)是可以借助開(kāi)源的資源,開(kāi)箱即用,功能全面,但是與之帶來(lái)的是附帶的配置和表數(shù)量比較多的維護(hù)問(wèn)題。以Activiti為例,使用Activiti7.0版本至少要引入二十多張表,雖然說(shuō)看似是無(wú)侵入的方式,但是系統(tǒng)演進(jìn)和維護(hù)過(guò)程中有一定的成本。特別是業(yè)務(wù)流程實(shí)例很多的時(shí)候,開(kāi)發(fā)人員需要對(duì)表邏輯有更深的把控。
  • 由于業(yè)務(wù)的客觀獨(dú)特性,作為業(yè)務(wù)流程組件,一般都需要根據(jù)自身業(yè)務(wù)進(jìn)行二次開(kāi)發(fā)適配。 比如需要根據(jù)自身組織架構(gòu),進(jìn)行流程節(jié)點(diǎn)用戶角色權(quán)限的管控;將自身的業(yè)務(wù)能力插件化,加入工作流程配置中,進(jìn)行攔截回調(diào)等。

4.2 自研引擎核心設(shè)計(jì)思路

4.2.1 引擎核心模塊

回歸工作流的本質(zhì), 工作流是通過(guò)預(yù)定義的流程模板,對(duì)現(xiàn)實(shí)活動(dòng)進(jìn)行實(shí)例化的過(guò)程。一個(gè)基本的工作流引擎主要包括三大核心部分:

  • 流程模板創(chuàng)建

根據(jù)業(yè)務(wù)規(guī)則和邏輯,創(chuàng)建流程模板,設(shè)置每一個(gè)節(jié)點(diǎn)的操作和變更路徑?;谀0鍎?chuàng)建,可以延伸出流程設(shè)計(jì)器、插件式節(jié)點(diǎn),多樣化的模板文件格式、模板持久化等。

  • 流程實(shí)例發(fā)布

根據(jù)流程模板,創(chuàng)建一個(gè)流程實(shí)例,流程模板和流程實(shí)例的關(guān)系類(lèi)似類(lèi)和對(duì)象的關(guān)系。比如說(shuō)工單系統(tǒng)管理員定義好一個(gè)審批流模板(流程模板),用戶點(diǎn)擊創(chuàng)建一個(gè)工單(流程實(shí)例)。基于流程實(shí)例發(fā)布,又可以延伸出實(shí)例實(shí)時(shí)觀測(cè),節(jié)點(diǎn)變遷記錄回溯,實(shí)例狀態(tài)持久化,失敗重試,事務(wù)控制等。

  • 任務(wù)流程執(zhí)行

創(chuàng)建好流程實(shí)例之后,流程實(shí)例只需要按照流程模板的定義獨(dú)立執(zhí)行各自實(shí)例的任務(wù),不同的實(shí)例之間互不影響,完成各自實(shí)例的生命周期。

4.2.2 引擎核心設(shè)計(jì)

① 應(yīng)用容器啟動(dòng)時(shí),加載流程引擎環(huán)境配置,包括解析器構(gòu)造,流程引擎上下文,流程定義文件路徑等。

② 讀取定好的流程定義文件,進(jìn)行流程節(jié)點(diǎn)解析,構(gòu)建好執(zhí)行上下文,將流程節(jié)點(diǎn)放到內(nèi)存緩存中。

③ 業(yè)務(wù)側(cè)進(jìn)行流程創(chuàng)建,啟動(dòng)一個(gè)新的流程實(shí)例,同時(shí)將業(yè)務(wù)流程和流程實(shí)例進(jìn)行綁定。

④ 運(yùn)行流程實(shí)例各個(gè)節(jié)點(diǎn),將每個(gè)流程節(jié)點(diǎn)進(jìn)行持久化保存。


4.3 具體實(shí)踐

① 引擎核心服務(wù)。

引擎操作的主要對(duì)外接口,包括啟動(dòng)流程實(shí)例,和獲取相關(guān)流程定義模板,流程實(shí)例,流程節(jié)點(diǎn)的服務(wù)。

public interface FlowEngine {
 
    /**
     * 根據(jù)流程定義key,參數(shù)列表啟動(dòng)流程實(shí)例
     *
     */
    FlowInstance startInstance(String processDefKey, Map<String, Object> args);
 
    /**
     * 根據(jù)流程定義主鍵ID,參數(shù)列表執(zhí)行流程任務(wù)(推動(dòng)流程自動(dòng)流轉(zhuǎn))
     * 統(tǒng)一事務(wù)控制
     */
    void execInstance(Long instanceId, Map<String, Object> args) throws FlowAuthorityException;
 
     /**
     * 獲取流程定義process服務(wù)
     *
     */
    ProcessService process();
 
    /**
     * 獲取流程實(shí)例服務(wù)
     *
     */
    InstanceService instance();
 
    /**
     * 獲取任務(wù)節(jié)點(diǎn)服務(wù)
     *
     */
    TaskService task();
}

② 流程定義服務(wù)。

主要是針對(duì)流程定義模板的創(chuàng)建和發(fā)布,可以根據(jù)具體的實(shí)現(xiàn)類(lèi)來(lái)支持不同的創(chuàng)建方式。

public interface ProcessService {  
   /**
     * 創(chuàng)建流程定義模板
     *
     */
    void create(String definition);
 
   /**
     * 發(fā)布流程定義模板
     *
     */
    void deploy(String fileName);
 
    /**
     * 獲取流程key對(duì)應(yīng)的流程定義
     */
    FlowProcess getProcessByDefKey(String processDefKey);
}

③ 流程實(shí)例服務(wù)。

提供流程實(shí)例創(chuàng)建持久化和流程實(shí)例執(zhí)行的入口。

public interface InstanceService {
    /**
     * 創(chuàng)建流程實(shí)例
     *
     */
    FlowInstance createInstance(FlowProcess process, Map<String, Object> args);
 
    /**
     * 執(zhí)行流程實(shí)例
     *
     * @param instanceId 流程實(shí)例id
     */
    void exec(Long instanceId);
 
    /**
     * 根據(jù)id獲取流程實(shí)例
     *
     * @param instanceId
     * @return
     */
    FlowInstance getById(Long instanceId);
}

④ 流程任務(wù)節(jié)點(diǎn)服務(wù)。

提供流程節(jié)點(diǎn)具體每個(gè)任務(wù)的創(chuàng)建和查詢(xún)。

public interface TaskService {
 
    /**
     * 根據(jù)任務(wù)模型、執(zhí)行對(duì)象創(chuàng)建新的任務(wù)
     *
     */
    FlowTask createTask(TaskModel taskModel, Execution execution);
 
    /**
     * 完成任務(wù)
     *
     */
    FlowTask complete(Long taskId,  Map<String, Object> args);
 
    /**
     * 獲取流程實(shí)例中正在進(jìn)行的任務(wù)
     *
     */
    FlowTask getActiveTask(Long instanceId);
 
    /**
     * 獲取流程實(shí)例上一個(gè)已完成的任務(wù)
     *
     */
    FlowHistTask getLastDoneTask(Long instanceId);
}

其中核心的方法就是

FlowEngine#startInstanceByKey,啟動(dòng)流程實(shí)例?;诹鞒潭x,創(chuàng)建一個(gè)流程實(shí)例對(duì)象。

FlowEngine#execInstance,執(zhí)行流程實(shí)例任務(wù),通過(guò)傳入的上下文參數(shù)(操作人,操作變量等),按照流程定義的節(jié)點(diǎn)任務(wù),推進(jìn)流程實(shí)例的自動(dòng)流轉(zhuǎn)。

4.4 思考和擴(kuò)展

  • 流程定義解析性能。

由于目前設(shè)計(jì)是在應(yīng)用啟動(dòng)時(shí)對(duì)所有的流程定義文件進(jìn)行加載和解析,流程定義文件過(guò)多時(shí)會(huì)影響應(yīng)用啟動(dòng)速度,可以通過(guò)多線程解析和懶加載(使用時(shí)解析)兩種方式進(jìn)行優(yōu)化。

  • 流程定義版本兼容性。

由于業(yè)務(wù)流程不是一成不變的,在項(xiàng)目發(fā)展過(guò)程中會(huì)不斷進(jìn)行迭代,需要對(duì)前面不同的流程進(jìn)行兼容。

  • 流程節(jié)點(diǎn)插件化和編排能力。

將基礎(chǔ)服務(wù)進(jìn)行提取公用,以支持繪制不同流程的插件化和編排能力。

  • 流程執(zhí)行監(jiān)控能力。

對(duì)流程任務(wù)節(jié)點(diǎn)執(zhí)行情況進(jìn)行埋點(diǎn)上報(bào),系統(tǒng)自動(dòng)進(jìn)行監(jiān)測(cè)告警。

五、總結(jié)

本文分析了引入工作流引擎的背景,驅(qū)使業(yè)務(wù)邏輯從控制流中剝離出來(lái),讓產(chǎn)研團(tuán)隊(duì)更聚焦于業(yè)務(wù),解決研發(fā)效率低的問(wèn)題。

工作流的本質(zhì)思想是通過(guò)預(yù)定義的工作流程模板,對(duì)現(xiàn)實(shí)活動(dòng)進(jìn)行實(shí)例化的過(guò)程。一般需要具備流程可視化、業(yè)務(wù)可編排復(fù)用、 業(yè)務(wù)和控制分離的基本能力。一般常見(jiàn)的工作流分為順序工作流、狀態(tài)機(jī)工作流和規(guī)則驅(qū)動(dòng)工作流,開(kāi)源工作流框架中最常見(jiàn)的是狀態(tài)機(jī)工作流,利用事件驅(qū)動(dòng)的方式,驅(qū)使流程運(yùn)轉(zhuǎn)。

同時(shí)簡(jiǎn)單介紹了業(yè)界比較流行的幾種開(kāi)源工作流引擎的特點(diǎn),結(jié)合開(kāi)源工作流引擎的特點(diǎn)的問(wèn)題,并且針對(duì)多樣化和迭代頻繁的業(yè)務(wù)流程, 以工作流的本質(zhì)思想為出發(fā)點(diǎn),我們自研了一套輕量級(jí)的工作流引擎,分享了在實(shí)踐過(guò)程中的設(shè)計(jì)思路和總結(jié)思考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容