TUXEDO在自動(dòng)語(yǔ)音應答系統中的使用
姜曉亮
2002/11/08
隨著(zhù)企業(yè)經(jīng)營(yíng)觀(guān)念、服務(wù)意識的不斷提高,自動(dòng)語(yǔ)音應答(IVR,Interactive Voice Response)系統得到了越來(lái)越廣泛的應用,如電信企業(yè)提供的170話(huà)費查詢(xún)系統、1861手機話(huà)費查詢(xún)系統、手機充值卡系統、各大銀行提供的儲蓄業(yè)務(wù)查詢(xún)系統乃至航空公司提供的航班查詢(xún)系統等,都是使用IVR系統來(lái)實(shí)現的。由于不需要人工介入、同時(shí)具有全天候服務(wù)的特點(diǎn),有理由相信IVR還會(huì )在各個(gè)行業(yè)得到更廣泛的應用。
IVR系統與中間件
通過(guò)IVR實(shí)現的業(yè)務(wù)都是用戶(hù)實(shí)時(shí)參與的,具有一定的實(shí)時(shí)性,每筆事務(wù)的信息量較小,所以,都屬于典型的聯(lián)機事務(wù)處理(OLTP)業(yè)務(wù)。隨著(zhù)IVR單臺集成度的不斷提高,使語(yǔ)音呼叫的密度大大增加,形成了對IVR后臺業(yè)務(wù)數據庫的大量并發(fā)訪(fǎng)問(wèn),對后臺數據庫壓力也大大增加。
現在處理大量并發(fā)OLTP訪(fǎng)問(wèn)的通用方式是利用中間件技術(shù),以減少后臺數據庫的負擔,降低頻繁的數據庫連接與斷開(kāi)帶來(lái)的系統開(kāi)銷(xiāo),縮短事務(wù)處理的時(shí)間,提高數據訪(fǎng)問(wèn)的效率,同時(shí),利用交易中間件,還可以保證交易處理的完整性,避免可能引起的數據不一致。但在IVR系統中使用中間件和中間件的傳統使用方式有所不同。傳統上中間件的使用是單客戶(hù)端——單訪(fǎng)問(wèn),而在IVR中有可能是單客戶(hù)端——多并發(fā)訪(fǎng)問(wèn),這種不同給整個(gè)系統的實(shí)現帶來(lái)了挑戰,只有采用特定的手段,才能使兩者緊密結合在一起,形成一個(gè)高性能的IVR系統。
當前流行的優(yōu)秀中間件有BEA TUXEDO,IBM TXSeries,TONG LINK/EASY等產(chǎn)品,本文僅對BEA TUXEDO在IVR中的使用進(jìn)行闡述。
IVR系統的實(shí)現方式
下面是當前流行的IVR實(shí)現方式(以單機900線(xiàn)的IVR為例):
1. 單線(xiàn)程實(shí)現
此方式利用了有限狀態(tài)機的原理,利用一個(gè)線(xiàn)程不斷地依次監控話(huà)路的狀態(tài),并執行相應的操作,并完成其狀態(tài)的遷移。要使一次輪詢(xún)的時(shí)間足夠小,程序中執行的單個(gè)操作以及狀態(tài)的遷移,都必須只占用極短的時(shí)間,也就是說(shuō),程序中只能使用非阻塞(異步)的操作方式。
2. N線(xiàn)程實(shí)現
該實(shí)現方式和單線(xiàn)程方式的原理是一樣的,只是基于系統穩定和處理能力方面的考慮,利用三個(gè)(或N個(gè))線(xiàn)程分擔處理呼叫,這樣每個(gè)線(xiàn)程分擔300(900/N)線(xiàn)語(yǔ)音呼叫。同樣,程序中只能使用非阻塞(異步)的操作方式。
3. 多線(xiàn)程實(shí)現
呼叫處理上的多線(xiàn)程方式和前面介紹的單/N線(xiàn)程方式的實(shí)現原理有著(zhù)本質(zhì)的區別,每當有呼叫時(shí),系統就產(chǎn)生一個(gè)線(xiàn)程,用來(lái)監控、跟蹤用戶(hù)操作的全過(guò)程,當呼叫結束后,此線(xiàn)程也結束。由于線(xiàn)程間互不影響,線(xiàn)程內部可以采用阻塞(同步)的方式進(jìn)行數據操作。
TUXEDO編程接口
TUXEDO服務(wù)器端為了保證與多個(gè)客戶(hù)端的通信,為每個(gè)客戶(hù)端建立一塊獨立的連接資源,稱(chēng)為上下文(Context);而客戶(hù)端本身也分配了專(zhuān)用的資源,用來(lái)存儲發(fā)送/接收的數據。在新版的TUXEDO中,每個(gè)Context分別對應一個(gè)User License。
需要特別注意的是,TUXEDO對每個(gè)應用連接的訪(fǎng)問(wèn)請求進(jìn)行了限制,具體來(lái)說(shuō),就是在一個(gè)Context上,未完成的訪(fǎng)問(wèn)請求數目不能超過(guò)50個(gè),如果到達了50個(gè),后續的請求就會(huì )返回“Elimit”的錯誤,直到請求隊列長(cháng)度小于50為止。
1.單線(xiàn)程與多線(xiàn)程模式
在TUXEDO中,涉及單線(xiàn)程還是多線(xiàn)程的關(guān)鍵API是tpinit,主要作用是使Server端分配相應的資源,并建立連接。涉及到的API定義如下:tpinit(),tpgetctxt(),tpsetctxt()。
(1)單線(xiàn)程/進(jìn)程

在單線(xiàn)程/進(jìn)程模式下,通過(guò)調用tpinit,使Server端為每個(gè)Client端建立一個(gè)獨立的Context。如圖1所示,每個(gè)客戶(hù)端都利用一個(gè)單獨的連接與服務(wù)器進(jìn)行通信,獨享一個(gè)請求隊列。
在單線(xiàn)程/進(jìn)程的模式下,TUXEDO API的使用不需要任何專(zhuān)門(mén)設置:
tpinit( (TPINIT *)NULL) //建立連接
(2)多線(xiàn)程

在多線(xiàn)程模式下,調用tpinit就Server端為每個(gè)線(xiàn)程建立一個(gè)獨立的Context。如圖2所示,每個(gè)線(xiàn)程利用一個(gè)單獨的連接與服務(wù)器進(jìn)行通信,獨享一個(gè)請求隊列。
在多線(xiàn)程的模式下,TUXEDO API的使用按以下步驟進(jìn)行:
Ⅰ.在父進(jìn)程中分配tpinit參數空間:
tpinitbuf = tpalloc(TPINIT, NULL, TPINITNEED(0));
Ⅱ.在父進(jìn)程中設置多線(xiàn)程(多上下文)標記:
tpinitbuf->flags = TPMULTICONTEXTS;
Ⅲ.在線(xiàn)程中建立與Server連接,分配獨立Context資源: tpinit(tpinitbuf);
Ⅳ.在線(xiàn)程中保存Context資源句柄:tpgetctxt(&ctxt, 0);
Ⅴ.在線(xiàn)程中設置此線(xiàn)程使用的Context資源:tpsetctxt(ctxt, 0);
Ⅵ.線(xiàn)程中繼續其他API使用,使用方式不受影響。
注:TUXEDO7.1(含)以后的版本,才支持此多線(xiàn)程模式。
(3)偽多線(xiàn)程

所謂偽多線(xiàn)程模式,是指整個(gè)應用利用了多線(xiàn)程機制,在每個(gè)線(xiàn)程中也調用tpinit建立了與TUXEDO Server端的應用連接,但是,實(shí)際上Server端并沒(méi)有為每個(gè)線(xiàn)程建立一個(gè)獨立的Context,而是所有線(xiàn)程共享一個(gè)Context資源。如圖3所示,所有線(xiàn)程都利用一個(gè)共享的連接與服務(wù)器進(jìn)行通信,共享一個(gè)請求隊列。
2.同步/異步調用模式
TUXEDO的請求/響應方式有同步和異步兩種。同步方式中,請求方要一直等待到有響應后,再執行其他操作,也稱(chēng)為阻塞方式; 異步方式中,請求方發(fā)送出請求后,立即得到一個(gè)響應句柄,繼續執行其他操作,在合適的時(shí)候,再利用響應句柄,得到此請求的響應結果,也稱(chēng)為非阻塞方式。
涉及到API定義如下: tpcall(),tpacall(),tpgetreply()。其中,tpcall是同步調用方式,tpacall是發(fā)起異步請求,tpgetreply是得到異步請求的結果。
需要注意的是,只有將tpacall和tpgetreply的參數flags設置為T(mén)PNOBLOCK,才能實(shí)現真正的非阻塞方式,否則,僅僅能夠實(shí)現發(fā)送請求和取結果的異步分離,不能保證請求和取結果兩個(gè)動(dòng)作本身的非阻塞化。
前面我們提到,TUXEDO對每個(gè)Context上未完成的訪(fǎng)問(wèn)請求數目進(jìn)行了限制,不能超過(guò)50個(gè),這個(gè)限制對于同步/異步方式同樣有效,即未完成的tpcall的數目,或者已經(jīng)tpacall成功,但是未用tpgetreply成功取回結果的數目,都不能超過(guò)50個(gè)。
IVR與TUXEDO的結合
1. IVR單線(xiàn)程實(shí)現
在單進(jìn)程/線(xiàn)程IVR中,由于只有一個(gè)進(jìn)程/線(xiàn)程,所以,利用TUXEDO的單線(xiàn)程/進(jìn)程方式即可,考慮到數據訪(fǎng)問(wèn)的速度不可能一直穩定在毫秒級,所以,必須利用TUXEDO真正的異步調用模式,保證整個(gè)IVR系統輪詢(xún)和狀態(tài)遷移的時(shí)效性。
這里要注意900線(xiàn)的IVR存在一個(gè)Context只能對應50個(gè)未完請求的限制。但900線(xiàn)IVR中,超過(guò)50個(gè)并發(fā)TUXEDO請求的可能性是存在的,而且在系統繁忙階段,一旦系統性能稍有下降,后臺數據庫操作時(shí)間超過(guò)3~5秒,在這段時(shí)間內,累積的tpacall請求超過(guò)50個(gè)的可能性非常大。
因此,對應一個(gè)大規模的IVR系統,如果利用單線(xiàn)程來(lái)實(shí)現,在其中又結合了TUXEDO, 由于不能突破50個(gè)的限制,很難提供高效、穩定的實(shí)現方案。
2. IVR N線(xiàn)程實(shí)現
在N線(xiàn)程 IVR中,可以利用TUXEDO的單線(xiàn)程和多線(xiàn)程方式,甚至可以利用偽多線(xiàn)程方式,同樣,必須利用TUXEDO真正的異步調用模式。
如果利用TUXEDO單線(xiàn)程或者偽多線(xiàn)程方式,數字對比仍然是“900∶50”,和單線(xiàn)程IVR一樣的問(wèn)題還會(huì )出現。如果我們利用TUXEDO多線(xiàn)程方式,數字對比就是“900∶N*50”,這樣,就可以解決單線(xiàn)程IVR中遇到的不能突破50個(gè)請求的限制問(wèn)題。因此,對應一個(gè)大規模的IVR系統,如果利用N線(xiàn)程實(shí)現,在其中結合使用TUXEDO多線(xiàn)程方式,由于將限制擴大到了N*50,所以,系統繁忙階段,也能夠保證提供出高效、穩定的實(shí)現方案。
3. IVR多線(xiàn)程實(shí)現
在多線(xiàn)程IVR中,同樣可以利用TUXEDO的單線(xiàn)程、多線(xiàn)程、偽多線(xiàn)程方式,根據我們對多線(xiàn)程IVR的分析,各線(xiàn)程相對獨立,互不影響,利用TUXEDO的同步調用模式就可以了。
如果利用TUXEDO單線(xiàn)程或者偽多線(xiàn)程方式,我們仍然會(huì )遇到“請求”限制問(wèn)題。如果利用TUXEDO多線(xiàn)程方式,則可以解決“請求”限制問(wèn)題,但是,各線(xiàn)程頻繁地TPINIT、TPTERM會(huì )占用系統資源,而且多線(xiàn)程生成的多Context,并發(fā)占用了大量的license,如果license數量是60,那么這時(shí)遇到的問(wèn)題將是license限制,購買(mǎi)大量的license也就意味著(zhù)投資的增加,否則,系統繁忙階段,就不能提供穩定的服務(wù)。
通過(guò)分析,我們發(fā)現,每線(xiàn)IVR對應一個(gè)線(xiàn)程,占用一個(gè)Context,獨享50個(gè)請求的限制,非常浪費,可以考慮多個(gè)線(xiàn)程共享一個(gè)Context。
我們可以這樣實(shí)現: 在父進(jìn)程中通過(guò)9次tpinit可得到9個(gè)Context訪(fǎng)問(wèn)句柄,將900線(xiàn)IVR分成9組,每組100線(xiàn),每100線(xiàn)共享一個(gè)Context,在這100線(xiàn)各自對應的線(xiàn)程中,先調用tpsetctxt,指定此線(xiàn)程利用的Context,這樣就形成“100∶50”的比例關(guān)系,完全可以保證系統在繁忙階段提供高效的服務(wù)。IVR多線(xiàn)程實(shí)現方式如下圖所示:

在多線(xiàn)程的模式下,TUXEDO API的使用需要專(zhuān)門(mén)步驟:
(1) 在父進(jìn)程中分配tpinit參數空間:
tpinitbuf = tpalloc(TPINIT, NULL, TPINITNEED(0));
(2) 在父進(jìn)程中設置多線(xiàn)程(多上下文)標記:
tpinitbuf->flags = TPMULTICONTEXTS;
(3) 在父進(jìn)程中建立與Server連接,分配獨立Context資源:tpinit(tpinitbuf);
(4) 在父進(jìn)程中保存Context資源句柄:
tpgetctxt(&ctxt1, 0);
(5) 重復N次步驟(3)和(4)。
(6) 在某組IVR線(xiàn)程中都設置線(xiàn)程使用的共享Context資源:tpsetctxt(ctxtN, 0);
(7) 線(xiàn)程中繼續其他API使用,使用方式不受影響。
結論
由于IVR系統實(shí)現方式的不同,TUXEDO中間件使用方式的不同,系統規模的不同,為我們的系統設計提供了眾多組合的可能,同時(shí),也只有了解這些不同的實(shí)現方式,才能在眾多組合中選擇出有效方案。
通過(guò)以上介紹,我們知道,從功能上說(shuō),大容量IVR系統與TUXEDO等中間件進(jìn)行結合是一種趨勢。從系統實(shí)現上,我們也可以相信,IVR與TUXEDO一定可以提供一種有效的實(shí)現方式組合,架構出高效、穩定、投資節省的IVR系統。
計算機世界網(wǎng)(www.ccw.com.cn)
相關(guān)鏈接:
青龙|
靖边县|
彭泽县|
平凉市|
山东省|
平舆县|
天峨县|
白河县|
深水埗区|
玉门市|
古浪县|
荃湾区|
台北县|
循化|
建昌县|
夏津县|
旅游|
长海县|
黄龙县|
社旗县|
民和|
鹤山市|
金湖县|
萨嘎县|
文成县|
玛纳斯县|
邵阳市|
景洪市|
那曲县|
平邑县|
沁源县|
汾西县|
涟源市|
广水市|
丰县|
阳城县|
临邑县|
三明市|
炎陵县|
大竹县|
昌黎县|