最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

B站流程引擎設(shè)計(jì)與實(shí)踐

2023-02-17 12:00 作者:嗶哩嗶哩技術(shù)  | 我要投稿

本期作者


背景


隨著企業(yè)的發(fā)展,軟件開發(fā)的技術(shù)、架構(gòu)以及理念也在快速更新迭代,如何搭建一套兼容當(dāng)前IT架構(gòu)且能適應(yīng)未來(lái)變化的通用業(yè)務(wù)流程引擎是提升企業(yè)運(yùn)營(yíng)效率的關(guān)鍵。

Comet流程引擎自 2019 年啟動(dòng)研發(fā)并發(fā)布第一個(gè)版本,至今已陸續(xù)發(fā)布多個(gè)正式版本。該系統(tǒng)以其足夠的靈活性、通用性和易用性,支撐了B站業(yè)務(wù)中大量需要借助流程引擎來(lái)實(shí)現(xiàn)邏輯流轉(zhuǎn)和自動(dòng)化的場(chǎng)景,跨度從底層基礎(chǔ)設(shè)施、基礎(chǔ)架構(gòu)到上層各類業(yè)務(wù),如各類資源申請(qǐng)、應(yīng)用發(fā)布、推送審核、電子簽約、版權(quán)評(píng)級(jí)等等。

在此背景下,本文以Comet為例,圍繞流程引擎的作用、使用場(chǎng)景、技術(shù)實(shí)現(xiàn)和業(yè)務(wù)價(jià)值進(jìn)行詳細(xì)介紹。


概述


本文在企業(yè)級(jí)信息系統(tǒng)架構(gòu)下設(shè)計(jì)了一套通用流程平臺(tái)技術(shù),通過先進(jìn)的工作流(Workflow)技術(shù),按照集中化、標(biāo)準(zhǔn)化、集成化的原則,建設(shè)了一個(gè)面向日常管理與事務(wù)處理的通用流程平臺(tái)。一方面,從企業(yè)級(jí)信息系統(tǒng)架構(gòu)的角度,建立一個(gè)與應(yīng)用無(wú)關(guān)的通用流程模版,利用這種可配置的組件化模型來(lái)整合或改造現(xiàn)有應(yīng)用的審批集成模式。通過集中或分布的方式建立一套或多套系統(tǒng)平臺(tái),降低流程系統(tǒng)的復(fù)雜度,使流程應(yīng)用在能夠快速開發(fā)部署的同時(shí),簡(jiǎn)化管理維護(hù)工作、降低后期技術(shù)支持成本,另一方面可以實(shí)現(xiàn)各類管理與業(yè)務(wù)流程的統(tǒng)一管理和集中監(jiān)控。

作為B站面向運(yùn)維及業(yè)務(wù)的統(tǒng)一流程引擎,Comet支持移動(dòng)端H5及Web訪問,具備加簽、轉(zhuǎn)簽、并簽、或簽等多種審批能力。通過開放式的表單和插件最大程度地提供了頁(yè)面渲染和外部系統(tǒng)集成的靈活性并利用圖算法來(lái)檢測(cè)配置流程的正確性,幫助用戶減少錯(cuò)誤配置并提升接入效率。


場(chǎng)景實(shí)踐


項(xiàng)目的建設(shè)模式以致力于為用戶提供更低擁有成本、更高響應(yīng)效率的完整解決方案。

Comet流程引擎是以業(yè)務(wù)為中心,以流程為導(dǎo)向,它既具備傳統(tǒng) BPM 產(chǎn)品所必須的流程服務(wù)能力,可以滿足各種規(guī)模應(yīng)用系統(tǒng)的流程業(yè)務(wù)需求;同時(shí)具備流程服務(wù)化所需要的動(dòng)態(tài)伸縮、多租戶等特性,適應(yīng)于大型集團(tuán)公司的集中化、標(biāo)準(zhǔn)化的流程服務(wù)平臺(tái)建設(shè)。Comet流程引擎強(qiáng)調(diào)流程、人員和技術(shù)三大要素的有機(jī)結(jié)合,根據(jù)企業(yè)的具體情況制定人員的崗位職責(zé)、設(shè)計(jì)日常流程。以建立完備、關(guān)聯(lián)的業(yè)務(wù)資源配置管理數(shù)據(jù)庫(kù)為基礎(chǔ)和切入點(diǎn),實(shí)施事件管理、問題管理、變更管理、配置管理和發(fā)布管理等核心流程,實(shí)現(xiàn)配置管理數(shù)據(jù)庫(kù)相關(guān)數(shù)據(jù)項(xiàng)與核心流程的關(guān)聯(lián)和融合;使用規(guī)范化的流程管理辦法將每一項(xiàng)規(guī)章制度在日常工作中進(jìn)行模式化和固定化。

下面筆者通過幾個(gè)具體的流程設(shè)計(jì)來(lái)窺探利用以上基礎(chǔ)的能力實(shí)現(xiàn)的具體業(yè)務(wù)場(chǎng)景化需求的多樣性和復(fù)雜度。


?SRE自動(dòng)化類-緩存資源變更申請(qǐng)


在運(yùn)維自動(dòng)化的場(chǎng)景下,通過流程引擎的可視化流程模板、動(dòng)態(tài)表單和插件執(zhí)行功能,能夠以很低的成本將周期性、重復(fù)性、規(guī)律性的日常工作流轉(zhuǎn)化為自助化、自動(dòng)化工單,例如應(yīng)用系統(tǒng)維護(hù)的自動(dòng)化、巡檢過程自動(dòng)化和故障處理自動(dòng)化等等。基于在運(yùn)維場(chǎng)景應(yīng)用流程能力,極大的簡(jiǎn)化了運(yùn)維、SRE同學(xué)將日常中瑣事轉(zhuǎn)化為業(yè)務(wù)自助化的成本,降低了人員瑣事負(fù)載。

在具體的落地過程中,由于自動(dòng)化運(yùn)維依賴于各場(chǎng)景管控管理平臺(tái)提供的管控能力來(lái)提升運(yùn)維效率。像在緩存相關(guān)業(yè)務(wù)場(chǎng)景下,我們借助流程引擎實(shí)現(xiàn)相關(guān)資源大小的合理性評(píng)估以及緩存資源的自動(dòng)化創(chuàng)建。該流程往往需要申請(qǐng)人填寫對(duì)應(yīng)的緩存資源的信息,如:內(nèi)存大小、歸屬集群、申請(qǐng)應(yīng)用。同時(shí),根據(jù)變更的行為來(lái)控制流程的流轉(zhuǎn),保證了變更幅度比較大時(shí)的安全性。在與緩存管控平臺(tái)的能力交互中,該業(yè)務(wù)流基于流程插件的回調(diào)功能來(lái)驅(qū)動(dòng)緩存管控平臺(tái)在適時(shí)創(chuàng)建緩存資源。
該業(yè)務(wù)流的具體流程圖如下:



權(quán)限申請(qǐng)類-數(shù)據(jù)平臺(tái)表權(quán)限申請(qǐng)


在數(shù)據(jù)平臺(tái)的某些表權(quán)限申請(qǐng)的場(chǎng)景下,需要根據(jù)流程發(fā)起時(shí)的上下文信息作為入?yún)?lái)判斷該流程中的節(jié)點(diǎn)是否激活,這里涉及了大量的環(huán)節(jié)判斷和插件執(zhí)行。另外在審批過程中,人員需要及時(shí)感知節(jié)點(diǎn)任務(wù)?;贑omet流程引擎的環(huán)節(jié)通知能力,減少了環(huán)節(jié)之間的審批時(shí)延,提高了流程審批的及時(shí)性。

在該場(chǎng)景下,一些低安全等級(jí)的數(shù)據(jù)往往可以通過上下文的方式減少審批鏈路,縮減流程整體的審批時(shí)長(zhǎng)、提高審批效率。人員方面,Comet集成了OA和內(nèi)部權(quán)限系統(tǒng)的角色,在環(huán)節(jié)配置了對(duì)應(yīng)的角色后系統(tǒng)會(huì)根據(jù)發(fā)起人的不同去獲取相應(yīng)角色下的審批人員,減少了用戶手動(dòng)配置和維護(hù)的成本。
由于該場(chǎng)景需要使用到并簽的功能,即對(duì)某些環(huán)節(jié)實(shí)現(xiàn)根據(jù)傳遞的人員組數(shù)不同來(lái)拆分多個(gè)節(jié)點(diǎn),Comet將該環(huán)節(jié)的節(jié)點(diǎn)及上下游流轉(zhuǎn)關(guān)系進(jìn)行復(fù)制并增加自動(dòng)節(jié)點(diǎn)作為收束節(jié)點(diǎn)(收束節(jié)點(diǎn)只有在上游所有審批節(jié)點(diǎn)都通過后才會(huì)激活)。這個(gè)功能補(bǔ)充了Comet在節(jié)點(diǎn)橫向擴(kuò)展的靈活性,滿足了用戶對(duì)多組審批人審批的場(chǎng)景需求。用戶發(fā)起申請(qǐng)后,根據(jù)其所申請(qǐng)的表安全級(jí)別及部門信息來(lái)走不同的審批鏈。

基于流程條件的靈活性,業(yè)務(wù)方甚至可以將同一類流程抽象到一個(gè)流程來(lái)實(shí)現(xiàn),減少了流程模版配置的成本并增加了流程審批場(chǎng)景的多樣化。
該流程具體的流程圖如下所示:



?業(yè)務(wù)審批類-推送任務(wù)審批


在執(zhí)行推送任務(wù)的場(chǎng)景下,業(yè)務(wù)方通過其平臺(tái)預(yù)先計(jì)算出某個(gè)流程的審批鏈并傳遞給流程引擎。在這個(gè)場(chǎng)景下,Comet通過動(dòng)態(tài)線性流程的技術(shù)方案進(jìn)行支持覆蓋。該功能是在以流程模版配置功能之外的增強(qiáng)擴(kuò)展,業(yè)務(wù)無(wú)需配置流程模版和流轉(zhuǎn)關(guān)系,只需要按照順序排列對(duì)應(yīng)的審批人即可動(dòng)態(tài)生成節(jié)點(diǎn)數(shù)量。

在實(shí)際實(shí)踐中,業(yè)務(wù)方通過Push平臺(tái)創(chuàng)建推送任務(wù),Push平臺(tái)開啟審核工單。根據(jù)此次推送的上下文信息,實(shí)時(shí)計(jì)算出所需要的審批環(huán)節(jié)后,交由該權(quán)限組對(duì)應(yīng)的審核組進(jìn)行審核并記錄流程狀態(tài)變更消息,在審核流程完成后落入數(shù)據(jù)庫(kù)。
動(dòng)態(tài)線性流程減少了用戶配置流程模版的成本、提高了發(fā)起流程的靈活度,滿足了用戶動(dòng)態(tài)伸縮流程審批鏈的要求。同時(shí),動(dòng)態(tài)流程可以通過環(huán)節(jié)指定插件的方式將環(huán)節(jié)和流程的信息通知給平臺(tái)方,平臺(tái)方根據(jù)具體的環(huán)節(jié)和上下文做對(duì)應(yīng)的處理。
除上述優(yōu)勢(shì)之外,動(dòng)態(tài)線性流程在部分業(yè)務(wù)場(chǎng)景是有一定局限性。

由于動(dòng)態(tài)線性流程在發(fā)起時(shí),無(wú)法固定參數(shù)范圍和數(shù)量,這會(huì)導(dǎo)致流程維護(hù)管理成本增高,后續(xù)流程實(shí)例的排障成本高

在復(fù)雜流程的審批場(chǎng)景下,動(dòng)態(tài)配置流程需要業(yè)務(wù)自行傳遞大量流程圖的相關(guān)參數(shù),這塊會(huì)導(dǎo)致業(yè)務(wù)理解成本增加,從而導(dǎo)致出錯(cuò)概率提升。因而,復(fù)雜的業(yè)務(wù)流程,仍然需要使用流程模版的方式配置。

下圖是一個(gè)動(dòng)態(tài)線性流程的例子:



設(shè)計(jì)實(shí)現(xiàn)


?工作流程


為了方便讀者更好的理解Comet是如何工作的,筆者將簡(jiǎn)化后的系統(tǒng)流程程圖繪制在下方。它主要由以下幾個(gè)部分組成:

  • 用戶定義流程:用戶需要預(yù)先在Comet配置流程的流向、流轉(zhuǎn)條件等基礎(chǔ)模版元素。

  • 流程觸達(dá)相關(guān)人員:參與人收到相關(guān)通知后決定執(zhí)行具體的批準(zhǔn)操作。

  • 三方系統(tǒng)異步回調(diào)結(jié)果:插件通知三方系統(tǒng)節(jié)點(diǎn)相關(guān)狀態(tài),由其執(zhí)行內(nèi)部操作并回調(diào)結(jié)果。



?整體架構(gòu)



如上圖所示,整體架構(gòu)主要分為三個(gè)部分,它們分別是:

  • 管理層:負(fù)責(zé)模版、插件、請(qǐng)求的鑒權(quán)和圖的合法性檢測(cè)。

  • 引擎層:負(fù)責(zé)流程的核心功能如發(fā)起、流轉(zhuǎn)、拒絕、關(guān)閉、加簽和轉(zhuǎn)簽等。

  • 異步執(zhí)行層:負(fù)責(zé)流程引擎產(chǎn)生的事件動(dòng)作的處理。


?關(guān)鍵設(shè)計(jì)


流程模版


對(duì)于業(yè)務(wù)來(lái)說,流程模版即對(duì)其業(yè)務(wù)流程的具像化建模。通過配置和拖拽即可定義其流程節(jié)點(diǎn)的流向及流程元素的展示。流程模版和流程的關(guān)系比較類似程序設(shè)計(jì)語(yǔ)言中的類和對(duì)象的關(guān)系,如下圖所示:



一個(gè)流程模版可以實(shí)例化多個(gè)流程,并且流程模版維護(hù)了自身的版本,每一個(gè)流程都會(huì)關(guān)聯(lián)到具體的模版版本。流程模版支持節(jié)點(diǎn)編輯、節(jié)點(diǎn)抄送、流程抄送、延時(shí)通知、定時(shí)通知等多種功能,其可視化編輯頁(yè)面如下圖所示:



節(jié)點(diǎn)的邏輯屬性


對(duì)于一個(gè)流程圖來(lái)說,除了其開始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)以外,其他節(jié)點(diǎn)的入度和出度都大于或等于1。我們可以先不考慮節(jié)點(diǎn)向下游流轉(zhuǎn)的條件并默認(rèn)為自動(dòng)流轉(zhuǎn)。在這種情形下,對(duì)于入度大于1的節(jié)點(diǎn)往往會(huì)持有兩種邏輯屬性,即且(and)和或(or)。下圖說明了這兩種條件的流轉(zhuǎn)形式:



節(jié)點(diǎn)的激活不僅需要通過其持有的邏輯屬性控制,往往還需要解析其邊所持有的流轉(zhuǎn)條件。


流轉(zhuǎn)條件


將流轉(zhuǎn)條件作為邊的屬性引入可以豐富流程的適配場(chǎng)景。它的使用需要依賴流程發(fā)起時(shí)以及過程中傳遞的上下文參數(shù)。譬如在一個(gè)出度為n的節(jié)點(diǎn),我們希望只有當(dāng)該節(jié)點(diǎn)的符合某個(gè)條件時(shí)才會(huì)激活某一分支的下游節(jié)點(diǎn),如下圖所示:



通過上下文參數(shù)n,我們可以控制被激活的節(jié)點(diǎn)。具體到某些實(shí)際場(chǎng)景來(lái)說,比如當(dāng)申請(qǐng)某個(gè)權(quán)限時(shí),通過判斷上下文傳遞的數(shù)據(jù)安全級(jí)別可以控制到不同的節(jié)點(diǎn),從而控制其審批流的差異度。

在Comet流程引擎中,我們采用的是一種MongoDB的條件表達(dá)式來(lái)做為流轉(zhuǎn)條件的表達(dá)式。舉個(gè)例子,當(dāng)我們希望滿足m>1或n>2任意一個(gè)條件就激活下游節(jié)點(diǎn)時(shí),表達(dá)式可以是如下所示:



這里表達(dá)式由于是一個(gè)標(biāo)準(zhǔn)的Json格式,無(wú)需自實(shí)現(xiàn)或引入語(yǔ)法解析器。流程引擎只需遞歸解析流程上下文和該表達(dá)式所計(jì)算出的布爾值即可判斷下級(jí)節(jié)點(diǎn)是否激活。


表單模版


Comet流程引擎除了支持兩種模版類型:組合模版和HTML模版。


  • 組合模版


通過在web頁(yè)面提供表單畫布和標(biāo)準(zhǔn)表單組件,用戶可以通過拖拽的形式將標(biāo)準(zhǔn)表單組件放入到表單模版內(nèi)。在單個(gè)表單的配置中,可以指定表單參數(shù)與流程上下文中的參數(shù)做綁定實(shí)現(xiàn)自動(dòng)賦值和展示。

目前,我們支持了16個(gè)通用的表單組件,3個(gè)高級(jí)表單組件(與周邊平臺(tái)定制的通用組件),基本滿足了日常業(yè)務(wù)流程設(shè)計(jì)中的所需要的表單能力。



  • HTML模版

在低代碼模板之外,我們?cè)黾恿薍TML模板。該模板通過iframe嵌入的方式,將用戶定義的前端代碼在節(jié)點(diǎn)環(huán)節(jié)展示。業(yè)務(wù)可以通過自定義HTML、JS和CSS代碼,并自行mock相應(yīng)的上下文參數(shù)來(lái)進(jìn)行完全靈活和高擴(kuò)展的業(yè)務(wù)表單展示設(shè)計(jì)。

該功能的設(shè)計(jì)作為低代碼模板功能的補(bǔ)充,用來(lái)覆蓋特殊業(yè)務(wù)場(chǎng)景下的表單展示功能,主要是滿足部分業(yè)務(wù)的復(fù)雜展示和表單移動(dòng)端展示需求。

展示形式如下:



可視化流程


對(duì)于一個(gè)既定的流程來(lái)說,我們可以使用mermaid來(lái)實(shí)現(xiàn)它的可視化。具體來(lái)說,我們只需要將流程中所有的節(jié)點(diǎn)編號(hào)和流轉(zhuǎn)條件以字符串的形式提供,并在前端使用該庫(kù),即自動(dòng)產(chǎn)生流程圖。舉個(gè)例子:



將會(huì)產(chǎn)生如下流程圖:



?引擎設(shè)計(jì)


除了這些概念之外,流程引擎還需要提供一組基礎(chǔ)的動(dòng)作用于控制流程的行為,譬如:流轉(zhuǎn)、拒絕和關(guān)閉等。


  • 節(jié)點(diǎn)流轉(zhuǎn)


當(dāng)節(jié)點(diǎn)被審批通過后,下游節(jié)點(diǎn)會(huì)根據(jù)與該節(jié)點(diǎn)間邊的流轉(zhuǎn)條件是否符合而被激活。在沒有自動(dòng)節(jié)點(diǎn)時(shí),流轉(zhuǎn)是一次性行為。我們通過遍歷它和下游節(jié)點(diǎn)邊的流轉(zhuǎn)條件,依次判斷條件表達(dá)式選擇要推動(dòng)的分支。但當(dāng)引入自動(dòng)流轉(zhuǎn)的節(jié)點(diǎn)后,我們就需要通過遞歸來(lái)處理這一動(dòng)作。偽代碼如下:



  • 節(jié)點(diǎn)拒絕


當(dāng)然,節(jié)點(diǎn)動(dòng)作還包含了拒絕操作。當(dāng)節(jié)點(diǎn)被拒絕時(shí),如果流程此時(shí)不存在一個(gè)節(jié)點(diǎn)能使其完結(jié),置流程狀態(tài)為拒絕。偽代碼如下:



這里的關(guān)鍵是如何判斷流程是否可以流轉(zhuǎn)。一個(gè)簡(jiǎn)單的思路是:由于上游流轉(zhuǎn)條件的邏輯屬性存在于下游節(jié)點(diǎn)中,我們可以通過自底向上的方法來(lái)判斷終止節(jié)點(diǎn)是否存在一條指向等待審批狀態(tài)的節(jié)點(diǎn)的通路這一命題是否成立來(lái)確定流程的狀態(tài)。Go版本代碼如下:



下面的左圖和右圖分別為活躍態(tài)和拒絕態(tài)的流程:



由于C節(jié)點(diǎn)被拒絕,此時(shí)右圖中已不存在可以使E節(jié)點(diǎn)到達(dá)B節(jié)點(diǎn)的通路了(D的激活條件時(shí)B、C均被流轉(zhuǎn))。


異步執(zhí)行設(shè)計(jì)


插件


流程執(zhí)行過程中往往需要和外部系統(tǒng)做交互已達(dá)到自動(dòng)化執(zhí)行某些操作。對(duì)于Comet流程引擎來(lái)說,它支持兩種類型的插件形式:二進(jìn)制文件和Python腳本。由于Python腳本相比于二進(jìn)制文件可維護(hù)性更好,所以插件主要采用此種形式來(lái)書寫。用戶上傳了插件文件之后,Comet會(huì)將其放置在其容器掛載的NAS中。流程中節(jié)點(diǎn)插件可以存在兩種,一種是在當(dāng)前節(jié)點(diǎn)狀態(tài)變?yōu)榇龑徟埃硪环N是在當(dāng)前節(jié)點(diǎn)執(zhí)行之后。具體如下圖所示:



我們可以將節(jié)點(diǎn)的待審批通知放在pre-plugin中,將節(jié)點(diǎn)處理后通知業(yè)務(wù)方系統(tǒng)的http調(diào)用放在after-plugin中,從而達(dá)到相關(guān)事件和對(duì)應(yīng)人和系統(tǒng)的綁定。事實(shí)上,將流程的所有動(dòng)作(諸如:發(fā)起、流轉(zhuǎn)、拒絕等)作為事件,然后配置相關(guān)事件的動(dòng)作(插件執(zhí)行、通知發(fā)送)會(huì)比這種方式更加靈活。

用戶上傳插件后,系統(tǒng)將為其生成唯一ID并存入NAS中,執(zhí)行日志將以日期與插件兩個(gè)維度組織存入磁盤,以方便批量清理及讀取供用戶排障,展示形式如下圖所示:



前后的執(zhí)行時(shí)間為系統(tǒng)寫入,方便定位插件超時(shí)問題。


回調(diào)


為了配合插件達(dá)到在節(jié)點(diǎn)/流程中耦合業(yè)務(wù)處理代碼邏輯,Comet流程引擎還實(shí)現(xiàn)了回調(diào)功能。在業(yè)務(wù)方處理邏輯需要被融合到節(jié)點(diǎn)成功/失敗的狀態(tài)中時(shí),業(yè)務(wù)方可以利用插件調(diào)用其處理接口并用處理結(jié)果回調(diào)Comet。其時(shí)序圖如下圖所示:




通過這種方式,業(yè)務(wù)方可以非常方便的處理流程引擎產(chǎn)生的事件動(dòng)作并靈活的定義其處理手段。


?合法性檢測(cè)算法


在流程模版的創(chuàng)建過程中,我們必須檢測(cè)其合法性。在計(jì)算機(jī)科學(xué)領(lǐng)域中,圖是一種抽象的數(shù)據(jù)類型。通常它由節(jié)點(diǎn)組成,并且按照邊的有向性無(wú)向性分為有向圖和無(wú)向圖。流程圖作為有向圖的一個(gè)分支,通常從一個(gè)起始點(diǎn)(入度為0)發(fā)散到一個(gè)終止點(diǎn)(出度為0)收斂。如下圖所示:



起始點(diǎn)A和終止點(diǎn)F可以輔助組織流程,并且可以方便我們定義流程的起止?fàn)顟B(tài)(即起/終點(diǎn)被激活)。


鄰接矩陣


領(lǐng)接表、領(lǐng)接矩陣關(guān)聯(lián)矩陣是圖的幾種常見的數(shù)據(jù)結(jié)構(gòu)。對(duì)于鄰接矩陣(adjacency matrix)來(lái)說,它是指一種方陣,用來(lái)表示有限圖。它的每個(gè)元素代表各點(diǎn)之間是否有邊相連。如下圖所示:



從左到右、從上到下分別代表A-F六個(gè)節(jié)點(diǎn)。方陣中元素為1代表從節(jié)點(diǎn)行到節(jié)點(diǎn)列存在一條有向通路。

對(duì)于流程來(lái)說它需要滿足只有一個(gè)入度為0和一個(gè)出度為0的節(jié)點(diǎn),也就是說在添加了輔助節(jié)點(diǎn)的流程的鄰接矩陣中必然有且僅有一行和一列全為0。然而僅通過此方式還存在一個(gè)問題:當(dāng)圖中有環(huán)時(shí)可能會(huì)導(dǎo)致流程一直循環(huán),無(wú)法終止。因此我們引入另一個(gè)概念 - 有向無(wú)環(huán)圖。


有向無(wú)環(huán)圖


在圖論中,如果一個(gè)有向圖從任意頂點(diǎn)出發(fā)無(wú)法經(jīng)過若干條邊回到該點(diǎn),則這個(gè)圖是一個(gè)有向無(wú)環(huán)圖DAG,?Directed?Acyclic?Graph)。對(duì)于一個(gè)流程來(lái)說,它也必將從某一節(jié)點(diǎn)發(fā)散,到某一節(jié)點(diǎn)收斂。因此一個(gè)有向圖為合法的流程是該有向圖為有向無(wú)環(huán)圖的充分不必要條件。

判斷一個(gè)圖是否為有向無(wú)環(huán)圖的算法有卡恩算法深度優(yōu)先搜索(DFS)。深度優(yōu)先搜索以任意順序循環(huán)遍歷圖中的每個(gè)節(jié)點(diǎn)。若搜索進(jìn)行中碰到之前已經(jīng)遇到的節(jié)點(diǎn),或碰到葉節(jié)點(diǎn),則中止算法。下面簡(jiǎn)單看下Go語(yǔ)言版本的實(shí)現(xiàn):



總結(jié)


工作流是業(yè)務(wù)流的一部分,而流程引擎就是驅(qū)動(dòng)業(yè)務(wù)按照公司設(shè)定的固定流程去流轉(zhuǎn),在復(fù)雜多變的業(yè)務(wù)情況下,使用既定的流程能夠提高工作效率,降低設(shè)計(jì)業(yè)務(wù)成本,保證業(yè)務(wù)執(zhí)行的準(zhǔn)確性。自Comet 2019年立項(xiàng)以來(lái),累計(jì)多版本迭代并穩(wěn)定運(yùn)行至今,業(yè)務(wù)涵蓋基數(shù)據(jù)平臺(tái)、運(yùn)維平臺(tái)、中間件平臺(tái)和推送平臺(tái)等多個(gè)內(nèi)部平臺(tái)和業(yè)務(wù)。

本文以Comet流程引擎為例,介紹了其基本的運(yùn)作流程、軟件架構(gòu)及代碼實(shí)現(xiàn)。對(duì)于Comet來(lái)說,靈活性是其產(chǎn)品設(shè)計(jì)的最大特點(diǎn)。通過插件、節(jié)點(diǎn)、流轉(zhuǎn)條件三者的組合,業(yè)務(wù)可以靈活的配置和實(shí)現(xiàn)絕大部分審批和自動(dòng)化場(chǎng)景的訴求。插件提高了業(yè)務(wù)與Comet的交互場(chǎng)景、流轉(zhuǎn)條件豐富了流程審批鏈的多樣性。Comet在復(fù)雜多變的業(yè)務(wù)情況下驅(qū)動(dòng)業(yè)務(wù)按照設(shè)定的流程去流轉(zhuǎn),使用既定流程大大降低設(shè)計(jì)業(yè)務(wù)的成本并保證了業(yè)務(wù)執(zhí)行的準(zhǔn)確性。同時(shí),由于流程引擎是低代碼平臺(tái)的核心,它可以幫助我們?nèi)?shí)現(xiàn)非常靈活的流程設(shè)計(jì),極大的助力企業(yè)實(shí)現(xiàn)數(shù)據(jù)流轉(zhuǎn)的的規(guī)范化和自動(dòng)化。


參考

[1] 業(yè)務(wù)流程建模和標(biāo)注規(guī)范:https://www.bpmn.org

[2] 鄰接矩陣:https://zh.wikipedia.org/wiki/%E9%82%BB%E6%8E%A5%E7%9F%A9%E9%98%B5

[3] 有向無(wú)環(huán)圖:https://zh.wikipedia.org/wiki/%E6%9C%89%E5%90%91%E6%97%A0%E7%8E%AF%E5%9B%BE

[4] About Mermaid:https://mermaid.js.org/#/README


B站流程引擎設(shè)計(jì)與實(shí)踐的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
九寨沟县| 大理市| 泾源县| 永福县| 高密市| 育儿| 栾城县| 平阳县| 邵东县| 海南省| 张北县| 五原县| 遂溪县| 玉龙| 漳平市| 牟定县| 石屏县| 长寿区| 同江市| 罗山县| 英吉沙县| 常山县| 临汾市| 富源县| 汤阴县| 冕宁县| 杭锦后旗| 河源市| 罗源县| 当雄县| 江油市| 通辽市| 介休市| 扎囊县| 灵山县| 九寨沟县| 连平县| 凤凰县| 赤峰市| 松桃| 敦煌市|