国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于流程的高效引擎開(kāi)發(fā)

2012-10-26 05:23:10王劍冰
關(guān)鍵詞:共享內(nèi)存引擎實(shí)例

王劍冰

一種基于流程的高效引擎開(kāi)發(fā)

王劍冰

(北京福富軟件技術(shù)股份有限公司福州分公司,福建,福州 350013)

在某些業(yè)務(wù)環(huán)境下,對(duì)實(shí)時(shí)的處理要求較高,需要由高效的流程引擎來(lái)帶動(dòng)的業(yè)務(wù)功能運(yùn)行。高效流程引擎使用C/C++編寫引擎內(nèi)核,使用共享內(nèi)存作為流程定義和流程實(shí)例等相關(guān)數(shù)據(jù)的緩存,并使用高效、交互性好、易擴(kuò)展的Lua腳本作為流程引擎部分類型節(jié)點(diǎn)的嵌入式執(zhí)行內(nèi)容。同時(shí),使用流程加載和日志落地等模塊,使得持久層和緩存之間進(jìn)行同步,不影響流程引擎核心的執(zhí)行效率。通過(guò)以上各方面的優(yōu)化提高了流程引擎整體的執(zhí)行效率。

流程引擎;Lua腳本語(yǔ)言;C/C++;共享內(nèi)存

業(yè)務(wù)流程管理一詞通常是指企業(yè)通過(guò)一系列活動(dòng),以能夠適應(yīng)動(dòng)態(tài)變化的環(huán)境的方式,自動(dòng)管理及優(yōu)化流程。業(yè)務(wù)流程可以被定義為一個(gè)由各種不同功能的活動(dòng)相連的一組有相互關(guān)系的任務(wù),它們依照一定的業(yè)務(wù)邏輯和順序依次執(zhí)行,業(yè)務(wù)流程有起點(diǎn)和終點(diǎn),而且它們都是可以重復(fù)的。業(yè)務(wù)流程管理(BPM)正在迅速成為企業(yè)獲得軟件敏捷性和適應(yīng)性的重要方法。近年來(lái),基于流程引擎技術(shù)構(gòu)建的應(yīng)用系統(tǒng)越來(lái)越受到客戶的追捧和認(rèn)可,能否支持流程可定制、可更改、可運(yùn)行的目標(biāo),也逐漸成為客戶衡量一個(gè)應(yīng)用系統(tǒng)主要標(biāo)準(zhǔn)之一[1]。目前國(guó)外有關(guān)流程引擎的產(chǎn)品有很多,如jBPM[2]、OSWorkflow、Apache ODE、WebSphere Process Server、Oracle Aqulogic、Microsoft BizTalk等。在國(guó)內(nèi),主要是在上述幾個(gè)引擎基礎(chǔ)上做擴(kuò)展和應(yīng)用,而且絕大部分是使用Java或C#實(shí)現(xiàn),主要是因?yàn)殡娮由虅?wù)的在流程引擎方面的應(yīng)用較多,流程引擎中的節(jié)點(diǎn)調(diào)用的業(yè)務(wù)相對(duì)流程引擎本身的性能要慢得多,流程引擎的優(yōu)化對(duì)整個(gè)流程的執(zhí)行效率影響不明顯[3],所以對(duì)于性能優(yōu)化的側(cè)重點(diǎn)一般不在流程引擎本身,但是,對(duì)于非電子商務(wù)的系統(tǒng),尤其是某些對(duì)實(shí)時(shí)性要求較高的系統(tǒng),如電信計(jì)費(fèi)系統(tǒng),業(yè)務(wù)網(wǎng)關(guān)等,流程引擎節(jié)點(diǎn)調(diào)用的業(yè)務(wù)執(zhí)行速度很快,如果流程引擎不夠優(yōu)化,對(duì)整個(gè)流程執(zhí)行的效率影響就比較大。流程引擎的主要功能是執(zhí)行業(yè)務(wù)流程,是BPM的架構(gòu)核心,其設(shè)計(jì)好壞、效率高低直接影響到整個(gè)BPM的性能高低。C/C++語(yǔ)言的主要特性就是高效,與操作系統(tǒng)底層交互良好,高效流程引擎應(yīng)基于C/C++來(lái)編寫[4]。

1 高效流程引擎設(shè)計(jì)

1.1 流程引擎總體架構(gòu)

一個(gè)流程引擎包括很多模塊,其內(nèi)核主要是流程加載、流程執(zhí)行和數(shù)據(jù)同步,提高流程引擎的性能,就必須提高流程引擎執(zhí)行內(nèi)核的效率,讓流程的執(zhí)行環(huán)境在內(nèi)存中進(jìn)行,所以架構(gòu)中引入了緩存部分,設(shè)計(jì)專門的流程加載模塊可以將配置數(shù)據(jù)向緩存中加載,同時(shí)還設(shè)計(jì)專門的數(shù)據(jù)同步模塊能將緩存中執(zhí)行結(jié)束的流程實(shí)例同步到持久層(數(shù)據(jù)庫(kù)或文件),而流程引擎的使用者通過(guò)接口調(diào)用流程執(zhí)行的時(shí)候只會(huì)在緩存中進(jìn)行,故而能提高流程引擎的性能。高效流程引擎總體架構(gòu)圖如圖1所示。

圖1 高效流程引擎架構(gòu)

從圖1可以看出,業(yè)務(wù)流程必然和功能模塊打交道,可以將一些功能模塊編寫成動(dòng)態(tài)庫(kù),以便在流程中動(dòng)態(tài)加載并被流程直接調(diào)用,模塊化調(diào)用增強(qiáng)了執(zhí)行的效率。另外為支持靈活性和維護(hù)的方便性,需要引入一些即時(shí)生效的腳本作為節(jié)點(diǎn)的執(zhí)行內(nèi)容。從執(zhí)行效率以及接口效率來(lái)評(píng)估,使用C/C++語(yǔ)言作為流程引擎核心的編寫語(yǔ)言,而采用和C/C++語(yǔ)言交互性好且執(zhí)行效率很高的腳本語(yǔ)言Lua,是比較合適的方案。

1.2 流程定義

流程引擎的設(shè)計(jì)是面向圖的設(shè)計(jì),流程是由兩個(gè)最基本的元素組成:“節(jié)點(diǎn)”及“有向連接”。對(duì)于“有向連接”幾乎沒(méi)有任何歧義,所有的流程建模描述中“有向連接”都是存在“From”和“To”這兩個(gè)特性。但是對(duì)于“節(jié)點(diǎn)”,則因?yàn)樗幍囊暯恰⒐δ懿煌?,則存在很多不同的理解,比如WFMC的過(guò)程定義元模型、jBPM、EPC中對(duì)節(jié)點(diǎn)含義和種類的定義都不太相同[5]。高效流程引擎中的節(jié)點(diǎn)類型包含:開(kāi)始、結(jié)束、函數(shù)、腳本、狀態(tài)、分支(并行、判斷)、匯聚等,如圖2所示。

圖2 節(jié)點(diǎn)連接圖

各節(jié)點(diǎn)既有共性也有個(gè)性,從流程定義的角度,將節(jié)點(diǎn)抽象為父類,各種類型的節(jié)點(diǎn)繼承節(jié)點(diǎn)父類,并增加自己的屬性、函數(shù),以及實(shí)現(xiàn)節(jié)點(diǎn)執(zhí)行函數(shù)。各節(jié)點(diǎn)的類圖關(guān)系如圖3所示。

圖3 節(jié)點(diǎn)類關(guān)系

將節(jié)點(diǎn)類設(shè)計(jì)為一個(gè)抽象類,它包含了純虛函數(shù)virtual execute()=0,在執(zhí)行流程時(shí)以父類對(duì)象指針指向最終節(jié)點(diǎn)類的對(duì)象,并調(diào)用父類對(duì)象指針的execute函數(shù),則實(shí)際會(huì)調(diào)用最終子類中的所實(shí)現(xiàn)的execute成員函數(shù)。在流程引擎中我們?nèi)コ擞邢蚓€連接對(duì)象,即jBPM中的Transition,使用每個(gè)節(jié)點(diǎn)的前驅(qū)或后續(xù)節(jié)點(diǎn)號(hào)的方式來(lái)貫穿整個(gè)流程。任何流程的開(kāi)始節(jié)點(diǎn)號(hào)都定義為0。

1.3 流程解析與加載

前臺(tái)配置的流程的定義是存儲(chǔ)在數(shù)據(jù)庫(kù)中的,一般的流程引擎的做法是每次連續(xù)的執(zhí)行都要到數(shù)據(jù)庫(kù)中去讀取流程配置,這樣勢(shì)必造成I/O的增加,降低流程引擎的性能。由于流程定義的讀頻率要遠(yuǎn)遠(yuǎn)高于寫頻率,所以,要保證流程的高速運(yùn)轉(zhuǎn),必須將流程定義加載到內(nèi)存中,并且解決好讀寫的沖突問(wèn)題。

流程定義緩存主要分為共享內(nèi)存和私有內(nèi)存兩部分,共享內(nèi)存是流程定義索引區(qū)和流程定義區(qū),這部分可以由所有調(diào)用者的程序共享讀??;私有內(nèi)存是腳本加載區(qū)和動(dòng)態(tài)庫(kù)加載區(qū),在程序啟動(dòng)的時(shí)候需加載和初始化。流程索引是根據(jù)流程定義ID以及流程的版本號(hào)查找流程定義存放的地址的區(qū)域,為了加速流程定義的查找速度。流程定義使用xml格式配置,調(diào)用rapidxml[6]開(kāi)源程序中的函數(shù)進(jìn)行解析,并將配置按類的定義以序列化方式保存在共享內(nèi)存的流程定義中。

由于流程的執(zhí)行是一個(gè)持續(xù)的過(guò)程,在流程實(shí)例未結(jié)束之前,改流程實(shí)例使用的流程配置都應(yīng)該保持在內(nèi)存中且不能被改動(dòng)。對(duì)于新增的流程,在流程定義區(qū)新開(kāi)辟空間并上載新流程定義,上載完成后鎖定流程定義索引區(qū),更新Hash(流程定義ID,流程版本)和流程定義存放地址的對(duì)應(yīng)關(guān)系,然后解鎖;對(duì)于要?jiǎng)h除的流程,一般是將該流程打上刪除標(biāo)志而不是立即刪除,由流程上載模塊負(fù)責(zé)查詢沒(méi)有使用該流程定義的流程實(shí)例后將其刪除并回收空間;對(duì)于修改的流程,采用升級(jí)的方式處理,也就是先將新的流程加載到新開(kāi)辟的流程區(qū),并更新流程定義索引區(qū),新的流程實(shí)例會(huì)按新版本執(zhí)行,當(dāng)使用舊版本的流程實(shí)例全部結(jié)束后,流程上載模塊會(huì)將舊版本的流程定義刪除并回收空間。通過(guò)這樣的增、刪、改的機(jī)制可以解決流程定義讀寫的沖突。

1.4 流程腳本

腳本具有靈活性強(qiáng)、能立即生效等特點(diǎn),在流程引擎的節(jié)點(diǎn)中使用腳本可以帶來(lái)靈活性和擴(kuò)展性和高效性。Lua腳本語(yǔ)言是用標(biāo)準(zhǔn)C編寫而成的嵌入式腳本語(yǔ)言和C/C++有良好的交互性,能為應(yīng)用程序提供靈活的擴(kuò)展和定制功能,而且?guī)缀踉谒胁僮飨到y(tǒng)和平臺(tái)上都可以編譯和運(yùn)行。Lua是腳本語(yǔ)言中執(zhí)行效率最高且很輕量級(jí),內(nèi)存占用很少[7]。

經(jīng)過(guò)對(duì)相同的浮點(diǎn)數(shù)運(yùn)算程序測(cè)試,以C語(yǔ)言(編譯器gcc 4.0.1)為基準(zhǔn),進(jìn)行速度測(cè)試,可得出如圖4的各種腳本語(yǔ)言執(zhí)行效率的對(duì)比數(shù)據(jù)。

圖4 腳本語(yǔ)言效率對(duì)比

Lua和C語(yǔ)言的交互,一般是Lua嵌入到C/C++程序中,簡(jiǎn)單的功能可以直接由Lua函數(shù)提供,如果Lua完成不了的,也可以編寫可由Lua調(diào)用的C/C++接口函數(shù),讓Lua起到橋梁作用,快速重組這些接口函數(shù)。

1.5 流程監(jiān)控

流程的執(zhí)行過(guò)程在后臺(tái)進(jìn)行,流程引擎需要提供對(duì)流程實(shí)例執(zhí)行情況的監(jiān)控。流程實(shí)例中的節(jié)點(diǎn)狀態(tài)、執(zhí)行時(shí)間、流程變量值等的都在共享內(nèi)存區(qū)中可以通過(guò)IPC進(jìn)行訪問(wèn),流程引擎為監(jiān)控提供了一系列查詢接口供同主機(jī)的外部進(jìn)程訪問(wèn),并且可以在此基礎(chǔ)上封裝成監(jiān)控服務(wù),供遠(yuǎn)程主機(jī)訪問(wèn)和顯示。由于在共享內(nèi)存中進(jìn)行查詢開(kāi)銷較少,所以可以提供較為實(shí)時(shí)的監(jiān)控。

1.6 流程日志

一個(gè)流程實(shí)例執(zhí)行結(jié)束的流程引擎會(huì)產(chǎn)生一個(gè)消息存放在隊(duì)列中,由入庫(kù)模塊將流程實(shí)例執(zhí)行的成功與否以及各節(jié)點(diǎn)執(zhí)行情況和時(shí)間保存到數(shù)據(jù)庫(kù),相當(dāng)于記錄了流程的執(zhí)行軌跡,并將該流程實(shí)例從共享內(nèi)存中的空間釋放出來(lái)。

流程入庫(kù)程序可以是多線程并行執(zhí)行,并且是在流程結(jié)束后才進(jìn)行,而且實(shí)例與監(jiān)控區(qū)的共享內(nèi)存空間較大,可以是對(duì)多個(gè)流程的批量處理,所以如果配置合適,并且流程實(shí)例的執(zhí)行壓力不是特別大的情況,基本不會(huì)形成性能瓶頸。關(guān)閉流程引擎將共享內(nèi)存中的所有數(shù)據(jù)落地到文件,重新啟動(dòng)時(shí)則從文件上載到共享內(nèi)存,如果主機(jī)在流程實(shí)例未執(zhí)行完成的時(shí)候出現(xiàn)崩潰,則因共享內(nèi)存數(shù)據(jù)失去,流程實(shí)例數(shù)據(jù)將會(huì)丟失,這是一種缺陷,但這是流程執(zhí)行效率和數(shù)據(jù)安全之間的一種權(quán)衡的結(jié)果。

2 測(cè)試與分析

2.1 測(cè)試環(huán)境

該測(cè)試的實(shí)驗(yàn)環(huán)境是:操作系統(tǒng)AIX 6.1,主機(jī)CPU 3.5GHZ,主機(jī)內(nèi)存8G的臺(tái)式機(jī);開(kāi)發(fā)工具為Java編譯器Java1.6,C++編譯器xlC 。

2.2 測(cè)試數(shù)據(jù)

在jBPM和高效率流程引擎都配置一個(gè)相同的流程定義如圖5。其中節(jié)點(diǎn)1腳本節(jié)點(diǎn),功能是設(shè)置一個(gè)整數(shù)型的流程變量值。節(jié)點(diǎn)2為判斷節(jié)點(diǎn),功能是將變量值取出,并將其乘以1.5加0.01,判斷結(jié)果是否大于3。節(jié)點(diǎn)3為業(yè)務(wù)功能節(jié)點(diǎn),操作是對(duì)變量進(jìn)行500次浮點(diǎn)加減乘除運(yùn)算。節(jié)點(diǎn)4為狀態(tài)節(jié)點(diǎn),無(wú)操作。

圖5 測(cè)試流程

2.3 測(cè)試結(jié)果

分別編寫Java程序和C++程序?qū)?.2中的準(zhǔn)備的完全相同的流程定義調(diào)用兩種流程引擎(jBPM和高效流程引擎)進(jìn)行流程定義加載、流程實(shí)例創(chuàng)建和實(shí)例執(zhí)行的速度測(cè)試。各進(jìn)行5組測(cè)試。流程定義加載效率測(cè)試和流程實(shí)例執(zhí)行測(cè)試的結(jié)果如表1所示。

表1 流程引擎加載與流程實(shí)例執(zhí)行測(cè)試

從表1測(cè)試結(jié)果可以得出,高效流程引擎的效率遠(yuǎn)遠(yuǎn)高于jBPM,分析其主要原因是jBPM的流程加載和流程執(zhí)行的每一步都對(duì)數(shù)據(jù)庫(kù)進(jìn)行了操作,增加了大量的I/O開(kāi)銷,而高效流程引擎使用共享內(nèi)存;并且jBPM使用的是Java語(yǔ)言,本身執(zhí)行效率上不如高效流程引擎使用的C/C++語(yǔ)言效率高。該測(cè)試數(shù)據(jù)的結(jié)果也表明可滿足大多數(shù)系統(tǒng)應(yīng)用中對(duì)流程引擎的性能要求。

3 結(jié)束語(yǔ)

在某些業(yè)務(wù)要求下,流程引擎除了注重功能還需注重性能。C/C++語(yǔ)言是當(dāng)前執(zhí)行效率最高的語(yǔ)言[8],Lua腳本是效率最高的腳本,且和C/C++語(yǔ)言的交互性以及自身擴(kuò)展性都很強(qiáng),高效流程引擎使用C++作為引擎核心的編寫語(yǔ)言,使用Lua作為腳本節(jié)點(diǎn)以及判斷節(jié)點(diǎn)的應(yīng)用,從程序執(zhí)行方面對(duì)性能進(jìn)行了提高。流程引擎在執(zhí)行過(guò)程中對(duì)流程定義的讀取以及日志的保存如果都使用數(shù)據(jù)庫(kù)或者文件,會(huì)給性能帶來(lái)較大瓶頸,所以高效流程引擎使用共享內(nèi)存作為流程定義、流程實(shí)例、流程日志等的數(shù)據(jù)緩存,并使用其他模塊來(lái)對(duì)流程定義進(jìn)行加載和日志的落地。高效流程引擎從各個(gè)方面提高了流程引擎的性能,經(jīng)過(guò)測(cè)試達(dá)到了業(yè)務(wù)系統(tǒng)對(duì)性能的要求。

[1] 胡長(zhǎng)城. 工作流的微內(nèi)核架構(gòu)[EB/OL].http://gocom. primeton.com/modules/gSpace/modules/techresource/article1803.htm, 2007-9-7.

[2] 胡長(zhǎng)城. 揭秘jbpm流程引擎內(nèi)核設(shè)計(jì)思想及構(gòu)架[EB/OL].http://www.uml.org.cn/workclass/200709305.asp, 2007-9-22.

[3] 何智華,王力生. 基于Web服務(wù)的電子商務(wù)業(yè)務(wù)流程中間件引擎的研究[J].計(jì)算機(jī)應(yīng)用, 2004(11):135-138.

[4] 陳蘭新. 基于C++的BPEL流程引擎原型的設(shè)計(jì)與實(shí)現(xiàn)[D]. 廣州:華南理工大學(xué),2009.

[5] 胡奇. jBPM4工作流應(yīng)用開(kāi)發(fā)指南[M].北京:電子工業(yè)出版社,2010.

[6] Marcin Kalicinski. RAPIDXML Manual[EB/OL].http:// rapidxml.sourceforge.net/manual.html, 2009-8-2.

[7] Roberto Ierusalimschy. Programming in Lua[EB/OL]. http://www.lua.org/pil/, 2012-3-4

[8] 盧曉苗,李從龍,張建明. 一例Java語(yǔ)言與C語(yǔ)言代碼運(yùn)行效率的比較[J]. 現(xiàn)代計(jì)算機(jī)(專業(yè)版), 2010(1): 116-118.

Development of High-performance and Flexible Process Engine

WANG Jian-bing

(Beijing Forich Software Technology Co., Ltd. Fuzhou Branch, Fuzhou , Fujiang 350013, China)

High real-time processing is required in some business environments, and then the high-performance process engine is needed to drive the business functions running. The core of high-performance process engine is written by C/C++, shared memory is used as a data cache for process definition and process instance, and the Lua script, which is efficient, interactive, easy to extend, is embedded in the execution content of some nodes of process engine. At the same time, the module of process loading and log storage synchronize the persistence layer and cache, the core of process engine is not affected. Through the optimization of the above aspects, the overall performance of the process engine is improved.

process engine; Lua script language; C/C++; share memory

TP391

A

10.3969/j.issn.1674-8085.2012.04.014

1674-8085(2012)04-0061-05

2012-02-24;

2012-03-27

王劍冰(1975-),男,福建浦城人,工程師,主要從事引擎開(kāi)發(fā)、數(shù)據(jù)庫(kù)優(yōu)化研究(E-mail: wangjb@ffcs.cn).

猜你喜歡
共享內(nèi)存引擎實(shí)例
通過(guò)QT實(shí)現(xiàn)進(jìn)程間的通信
藍(lán)谷: “涉藍(lán)”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
基于PCI總線的多處理器協(xié)同機(jī)制研究
無(wú)形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開(kāi)發(fā)
QNX下PEX8311多路實(shí)時(shí)數(shù)據(jù)采集的驅(qū)動(dòng)設(shè)計(jì)
電子世界(2014年21期)2014-04-29 06:41:36
完形填空Ⅱ
完形填空Ⅰ
一種高效RTAI 共享內(nèi)存管理層的研究與實(shí)現(xiàn)*
One Engine?。蹋澹妫糁皇O乱粋€(gè)引擎
嵩明县| 蒲江县| 烟台市| 陇川县| 清涧县| 石渠县| 保康县| 北宁市| 天水市| 阳城县| 鹿泉市| 漳浦县| 洛隆县| 泰州市| 广水市| 久治县| 辽阳市| 和龙市| 仙游县| 隆回县| 贡觉县| 梁河县| 阜平县| 大厂| 扎囊县| 儋州市| 民县| 康平县| 定西市| 湘阴县| 浦东新区| 鄂托克前旗| 古蔺县| 连江县| 历史| 盱眙县| 雅安市| 石柱| 金塔县| 昌江| 陵川县|