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