微內(nèi)核流程引擎(IVR導(dǎo)航)的設(shè)計(jì)與實(shí)現(xiàn)(一)——開(kāi)發(fā)背景
Posted on 2009-10-12 20:05 常高偉 閱讀(376) 評(píng)論(0) 編輯 收藏開(kāi)發(fā)背景
我們公司是主要從事企業(yè)語(yǔ)音方面產(chǎn)品的開(kāi)發(fā),主要產(chǎn)品比如:調(diào)度系統(tǒng),指揮系統(tǒng),電話會(huì)議系統(tǒng),呼叫中心系統(tǒng)等。這些系統(tǒng)都有一個(gè)共同特點(diǎn),就是涉及到呼叫,放音,收發(fā)按鍵,會(huì)場(chǎng)操作。我們的業(yè)務(wù)產(chǎn)品都是基于我們的軟交換系統(tǒng)之上構(gòu)建的,軟交換系統(tǒng)的應(yīng)用服務(wù)器向外提供這些服務(wù)。
產(chǎn)生的問(wèn)題
我們?cè)陂_(kāi)發(fā)的過(guò)程中就發(fā)現(xiàn)一個(gè)問(wèn)題,每個(gè)產(chǎn)品在此接口上都會(huì)做很多重復(fù)的開(kāi)發(fā),特別是在IVR處理上面。
IVR (Interactive Voice Response)即交互式語(yǔ)音應(yīng)答,可以提高呼叫服務(wù)的質(zhì)量并節(jié)省費(fèi)用。IVR是一種功能強(qiáng)大的電話自動(dòng)服務(wù)系統(tǒng)。
由于我們的系統(tǒng)重新架構(gòu),正在開(kāi)發(fā)軟交換API接口,所以我們?cè)噲D解決這個(gè)問(wèn)題。
為了方便上層對(duì)底層接口的調(diào)用,減少重復(fù)開(kāi)發(fā),產(chǎn)品能夠針對(duì)用戶需求迅速更改,我們提出了事務(wù)流的概念。即上層程序設(shè)定一個(gè)事務(wù)流,比如:相對(duì)用戶9092發(fā)起呼叫,用戶應(yīng)答后對(duì)用戶放音,讓用戶輸入密碼,密碼驗(yàn)證成功加入制定會(huì)場(chǎng)。上層程序設(shè)定好這樣的事務(wù)流后,發(fā)送給下層進(jìn)行處理。下層處理完畢后,回復(fù)處理結(jié)果。
事務(wù)流的概念最終并沒(méi)有實(shí)現(xiàn),一是我們對(duì)事務(wù)流的異常處理分析不足;二是采用事務(wù)流的概念擴(kuò)展性,可維護(hù)性不是很好。
后來(lái)我們?cè)谑聞?wù)流的基礎(chǔ)上引進(jìn)了SOA的概念,即將底層的接口封裝為一系列松散耦合的服務(wù),在上層通過(guò)對(duì)服務(wù)的編排實(shí)現(xiàn)流程編輯的功能。但是實(shí)施SOA困難非常大,一是SOA沒(méi)有大規(guī)模的應(yīng)用,文檔,經(jīng)驗(yàn)都比較少,實(shí)施風(fēng)險(xiǎn)較大;二是實(shí)施 SOA要工具的支持,需要投資。這樣的話我們寧可重復(fù)開(kāi)發(fā)。
最終這個(gè)流程編輯的功能并沒(méi)有完成,但是我們還是在API中實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的流程編輯,這個(gè)流程編輯是通過(guò)硬編碼來(lái)實(shí)現(xiàn)的,和我們的愿望相差較大。
新的思路
后來(lái)看了一家平臺(tái)軟件公司的介紹,他們是做企業(yè)應(yīng)用平臺(tái)的。企業(yè)應(yīng)用中很多的一點(diǎn)就是工作流。他們的平臺(tái)就是集成了一款開(kāi)源的工作流引擎:JBPM。第一次接觸JBPM,感覺(jué)很多思路可以借鑒。后來(lái)在網(wǎng)上搜資料的時(shí)候搜到幾篇研究微內(nèi)核流程引擎的文章:
揭秘jbpm流程引擎內(nèi)核設(shè)計(jì)思想及構(gòu)架
微內(nèi)核過(guò)程引擎的設(shè)計(jì)思路和構(gòu)架
微內(nèi)核工作流引擎體系架構(gòu)與部分解決方案參考
這幾篇文章是我設(shè)計(jì)流程引擎的核心基礎(chǔ)。看完之后最終決定自己設(shè)計(jì)一個(gè)微內(nèi)核流程引擎。
使用開(kāi)源還是自己開(kāi)發(fā)
決定動(dòng)手開(kāi)發(fā)前,有兩種方式,一是使用開(kāi)源產(chǎn)品,比如JBPM;二是自己動(dòng)手開(kāi)發(fā)。當(dāng)時(shí)的考慮是:
1、JBPM是用java開(kāi)發(fā),我們公司的業(yè)務(wù)產(chǎn)品目前基本上都是c,和java交互不便。
2、JBPM是針對(duì)企業(yè)工作流設(shè)計(jì)的,工作流和IVR導(dǎo)航一個(gè)重要的區(qū)別是,IVR導(dǎo)航對(duì)時(shí)效性要求很高。要求系統(tǒng)能夠及時(shí)響應(yīng)。
3、我不是JAVA出身,當(dāng)時(shí)對(duì)java還有些畏難心理。
所以,最終決定自己用C++開(kāi)發(fā)流程引擎。
如果是現(xiàn)在的話,即便是決定自己開(kāi)發(fā),一會(huì)好好研究一下JBPM的源碼的。
借鑒的其他思路
1、數(shù)據(jù)驅(qū)動(dòng)(DD)。在腳本中XML定義流程,程序啟動(dòng)后將流程讀入程序,然后供上層程序調(diào)用。如果流程更改,這直接修改腳本即可。
2、BPEL。Business Process Execution Language 的縮寫(xiě),意為業(yè)務(wù)過(guò)程執(zhí)行語(yǔ)言 ,是一種基于XML 的,用來(lái)描寫(xiě)業(yè)務(wù)過(guò)程的編程語(yǔ)言。我的腳步語(yǔ)言參考BPEL的描述。