一個(gè)呼叫中心的IVR系統(tǒng),該用什么模式呢? IVR系統(tǒng)應(yīng)該是一個(gè)狀態(tài)機(jī)模型,里面充斥著各種線路控制的狀態(tài)和事件(空閑,震鈴,掛機(jī),放音,錄音,加入會(huì)議,離開(kāi)會(huì)議,兩通道連接。。。。。)不過(guò)總的來(lái)說(shuō),線路部分的狀態(tài)和事件不會(huì)很多,并且是不會(huì)經(jīng)常變化的,可以看成是固定的就那幾個(gè)。然后,做應(yīng)用的時(shí)候,業(yè)務(wù)邏輯引入的自定義狀態(tài)就不可預(yù)料了。如何進(jìn)行解耦?如何保證底層線路控制部分的純潔不被業(yè)務(wù)邏輯所破壞?IVR系統(tǒng)是一個(gè)實(shí)時(shí)性要求很高的系統(tǒng),同時(shí)也是一個(gè)并發(fā)量很高的系統(tǒng)(絕對(duì)不能用一個(gè)通道一個(gè)線程的方法,只能用狀態(tài)機(jī)輪詢)。IVR系統(tǒng)的底層可以是各個(gè)廠家的語(yǔ)音卡,可以是各個(gè)廠家的交換機(jī),可以是來(lái)自IP的呼叫,甚至是短信,郵件等各種資源。這些應(yīng)該要和業(yè)務(wù)邏輯完全分離。我設(shè)想的是用分布式的進(jìn)程來(lái)解耦。外圍的線路資源(如語(yǔ)音板卡)做成獨(dú)立的一個(gè)進(jìn)程,不參與業(yè)務(wù)邏輯,做成一個(gè)只會(huì)做事,而不知道為什么做的“傻瓜”。業(yè)務(wù)邏輯單獨(dú)也是一個(gè)進(jìn)程,和數(shù)據(jù)庫(kù)打交道的也單獨(dú)做成一個(gè)進(jìn)程。。。。這樣,處理業(yè)務(wù)邏輯的程序就是一個(gè)依照業(yè)務(wù)邏輯發(fā)號(hào)命令,但是不知道如何具體實(shí)現(xiàn)這些命令的人(COMAND模式?),其他的各類資源網(wǎng)關(guān)都和這個(gè)業(yè)務(wù)程序打交道,各資源網(wǎng)關(guān)彼此之間不打交道(中介模式?)。如此思路下,那么一個(gè)業(yè)務(wù)流程的執(zhí)行就大概如下了:業(yè)務(wù)程序執(zhí)行流程,發(fā)現(xiàn)需要對(duì)用戶放音,就發(fā)個(gè)包(SOCKET通信)給板卡程序,發(fā)現(xiàn)需要執(zhí)行一個(gè)存儲(chǔ)過(guò)程,就發(fā)個(gè)包給數(shù)據(jù)庫(kù)程序,發(fā)現(xiàn)需要發(fā)條短信,就發(fā)個(gè)包給短信程序,發(fā)現(xiàn)需要做****,就發(fā)個(gè)包給&&&&. 這樣,板卡程序就只管聽(tīng)命令,對(duì)指定的通道放音,錄音,加入會(huì)議之類。然后把底層線路的變化事件發(fā)包給業(yè)務(wù)程序,數(shù)據(jù)庫(kù)程序也是,只管按要求執(zhí)行存儲(chǔ)過(guò)程,然后把結(jié)果發(fā)包給業(yè)務(wù)程序,短信。。。。等等。這樣,整個(gè)系統(tǒng)就很容易拓展了,并且外圍的程序也很容易編寫,用三匯卡,就作個(gè)三匯卡函數(shù)封裝的板卡程序,用AVAYA交換機(jī),就做個(gè)對(duì)應(yīng)的交換機(jī)程序。要IP應(yīng)用,就做個(gè)IP網(wǎng)關(guān)程序等等。
子泉博客