Flowable 簡要分析


一、Flowable是什么

Flowable是BPMN2.0協議的一種Java版本的實現。 

Flowable項目提供了一組核心的開源業務流程引擎,這些引擎緊湊且高效。它們為開發人員、系統管理員和業務用戶提供了一個工作流和業務流程管理(BPM)平台。它的核心是一個非常快速且經過測試的動態BPMN流程引擎。它基於Apache2.0開源協議,有穩定且經過認證的社區。 

Flowable可以嵌入Java應用程序中運行,也可以作為服務器、集群運行,更可以提供雲服務。 

與大多數故事一樣,Flowable也是因為其與Activiti對未來規划的路線不認同而開辟了一條自己的道路。目前主流的工作流開源框架就是Activiti/Camunda/Flowable,它們都有一個共同的祖先jbpm。先是有了jbpm4,隨后出來了一個Activiti5,Activiti5經過一段時間的發展,核心人員出現分歧,又分出來了一個Camunda。activiti5發展了4年左右,緊接着就出現了Flowable。 

相比於Activiti,Flowable的核心思想更像是在做一個多彩的工具,它在工作流的基礎功能上,提供了很多其他的擴展,使用者可以隨心所欲地把Flowable打造成自己想要的樣子。例如:Camel節點,Mule節點。他不僅有bpmn引擎,還有cmmn(案例管理模型),dmn(決策模型),content(內容管理),form(表單管理),idm(用戶鑒權)等等,但這也間接導致了Flowable的包結構非常繁多,上手非常困難。 

而Activiti則只着重於處理bpmn,它的方向在於雲,他的設計會盡量像例如Spring Cloud、Docker、K8S靠攏。 

如果你單純地想快速上手bpmn引擎,建議使用Activiti,如果你想做出花樣繁多的工作流引擎,建議使用Flowable。 

二、核心架構

上圖是我個人所理解的架構,從架構圖中可以看出,Flowable對於數據的處理是冷熱分離的,熱數據存在ACT_RU_系列表中,歷史冷數據存在ACT_HI_系列表中,定義相關的存在ACT_RE_系列表中,而對於在途和定義相關的數據,有一層緩存,他緩存的具體實現比較復雜,這里不多贅述。

對於協議到運行態的轉化,有專門一層Converter來實現,也就是說,如果你想自己定義一些協議外的東西,就需要關心這個部分。

最下面是節點行為層,這個很好理解,對於每種節點,都會有不同的實現,你也可以自定義實現。

Flowable在最新的版本中,對於歷史歸檔和異步任務做了新的優化,具體的看下面。

新的異步執行器(ASYNC EXECUTOR) 

在工作流中,異步執行大概分為兩類,timer和message,類似於定時事件就是timer,而異步的服務任務則為message,如上圖所示,“Task A”附着的邊界定時事件,在時間觸發之后,會執行“Escalate”任務,而“Async Service Task”在“Task A”流轉之后,會啟用一個異步任務去調用其服務。

對於一種全是異步服務任務的極端情況,如上圖所示,他常常出現於服務編排之類的場景之中,我們經常性的需要同時處理一系列的任務,這時候異步調度的作用就非常重要。  

為了提高性能,Flowable也采用了冷熱數據分離的思想,他把數據分為了4類,異步Job,定時器Timer,掛起任務,死信隊列。通過測試發現,數據庫是異步任務性能低下的主要瓶頸,特別是多實例競爭Job會存在潛在的問題。在分表的時候同時加上了一個全局鎖,保證了同一個實例只能由一個實例去獲取並鎖定job(job表中有字段會被update,內容為搶占到的實例代號),這樣反而能提升不少性能。為了保證各個實例不被餓死,還調整了一系列參數。 

流程歸檔異步化 

Flowable提供了一個更加優化的冷熱數據分離方案,在數據敏感性比較高的領域,我們一般會把引擎的歷史記錄級別調到最高(包括流程流轉歷史、變量變動歷史、簽收人變動歷史等等),這些歷史記錄在以前是在同一個上下文中執行的,雖然在最開始設計的時候,在途數據和歷史數據就冷熱分離了,但從權衡在途和歷史的重要性的角度來講,歷史其實不是最重要的,所以Flowable提供一系列的方法使歷史記錄這個行為異步化,與之對應的方法可以是jms,MQ或Spring Boot listener application。 這個改動可以提升在途流程效率20%-96%。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM