從入門到進(jìn)階-如何基于FreeSWITCH搭建呼叫中心平臺(tái)(freeswitch搭建呼叫中心難嗎)
文 | 楊先君
智慧企業(yè)架構(gòu)師、技術(shù)經(jīng)理
今天和大家分享一下
如何基于FreeSWITCH搭建一個(gè)呼叫中心平臺(tái)
入門篇
FreeSWITCH 是一個(gè)開源的電話交換平臺(tái)。官方給它的定義是–世界上第一個(gè)跨平臺(tái)的、伸縮性極好的、免費(fèi)的、多協(xié)議的電話軟交換平臺(tái)。 在FreeSWITCH出現(xiàn)之前,軟交換技術(shù)是高不可攀的領(lǐng)域,這種技術(shù)基本上掌握在少數(shù)通信企業(yè),集成在硬件設(shè)備上整機(jī)出售,價(jià)格昂貴。需要大量的專業(yè)積累才能入門,使用者基本上偏運(yùn)維,無法掌握實(shí)質(zhì)的技術(shù)。而現(xiàn)在,越來越多的開發(fā)者通過FreeSWITCH來深入了解通信技術(shù)。
FreeSWITCH的本質(zhì)和其它VoIP通信原理一致同樣是點(diǎn)到點(diǎn)的實(shí)時(shí)通信。當(dāng)FS以BypassMedia運(yùn)作時(shí),它即是兩個(gè)終端進(jìn)行實(shí)時(shí)通信的一個(gè)橋梁和工具,負(fù)責(zé)雙方媒體通道協(xié)商,交換雙方的RTP端口,編解碼,碼率等信息,詳細(xì)的SIP協(xié)議或協(xié)商流程可參見:RFC3261文檔,源碼及編譯安裝可以參見FreeSWITCH官網(wǎng)。
當(dāng)服務(wù)啟動(dòng)完成后,即呈現(xiàn)一個(gè)完整的PBX(Private Branch Exchange)系統(tǒng)。直接使用x-lite終端輸入分機(jī)號(hào)及密碼就能建立P2P通道來傳輸媒體流實(shí)現(xiàn)點(diǎn)到點(diǎn)通話。撥號(hào)計(jì)劃是FreeSWITCH中至關(guān)重要的一部分。它的主要作用就是對(duì)電話進(jìn)行路由。就是當(dāng)一個(gè)用戶撥號(hào)時(shí),對(duì)用戶所撥的號(hào)碼進(jìn)行分析,進(jìn)而決定下一步該做什么。它所能做的比你想象的要強(qiáng)大的多。如:可以撥打9196進(jìn)行回聲檢測測試媒體是否暢通,拔打3000進(jìn)行電話/視頻會(huì)議接入,不在線時(shí)進(jìn)行語音留言等,也可以構(gòu)建IM通信服務(wù)完成點(diǎn)到點(diǎn)的文本消息及實(shí)時(shí)文件傳輸,這些拔號(hào)計(jì)劃可以達(dá)到零編碼來進(jìn)行功能擴(kuò)展。同樣可以通過Endpoint模塊來實(shí)現(xiàn)不同種類的終端進(jìn)行互聯(lián)通話,如下圖所示:
當(dāng)然做信令代理并不是FS的強(qiáng)項(xiàng)和它做為軟交換身份的常規(guī)用途。由于SIP協(xié)議的特殊性(帶狀態(tài)的協(xié)議),使得它在內(nèi)網(wǎng)和公網(wǎng)變換且進(jìn)行NAT穿透時(shí)成了一個(gè)大麻煩,需要對(duì)sip協(xié)議的頭部及包體的SDP信息都要做深度的定制。做信令代理通常都會(huì)直接使用openSIPS/Kamailio,后邊的進(jìn)階篇時(shí)再詳說。正常情況下FS同終端之間的連接方式如下圖,媒體服暴露在公網(wǎng),信令及媒體均通過其進(jìn)行傳遞,目的是媒體通過服務(wù)端后就可以做媒體的播放,橋接,變更,混合,存儲(chǔ)等動(dòng)作,達(dá)到媒體交換的目的。也正是我們后邊講到作為呼叫中心核心網(wǎng)元的常規(guī)操作。
點(diǎn)到點(diǎn)通信的終端可以是Linphone/X-lite這種應(yīng)用也可以是PSTN電信交換網(wǎng)的接入接出設(shè)備,兩者的共同點(diǎn)是都遵循SIP標(biāo)準(zhǔn)可以無縫接入,不同點(diǎn)是來自PSTN網(wǎng)終相對(duì)穩(wěn)定且編碼大多是G711,來自互聯(lián)網(wǎng)應(yīng)用終端如果是移動(dòng)設(shè)備有弱網(wǎng)情況存在,為了應(yīng)對(duì)這種情況就會(huì)有iLBC、OPUS、G729、GSM等編碼,也有各種丟包補(bǔ)償機(jī)制、抗抖動(dòng)策略等相關(guān)算法。
目前WebRTC的實(shí)時(shí)音視頻已經(jīng)比較成熟,很多音視頻的平臺(tái)都利用其來搭建自已的點(diǎn)到點(diǎn)或者音視頻會(huì)議服務(wù),F(xiàn)reeSWITCH同樣也可以做為RTC的媒體交換參與其中。FS加載mod_sofia及mod_rtc模塊,默認(rèn)監(jiān)聽在7443端口,來處理wss sip的信令進(jìn)行sdp協(xié)商,協(xié)商后直接進(jìn)行rtp在加密通道上進(jìn)行傳輸。同樣默認(rèn)監(jiān)聽在5060端口,來處理在tcp或udp通道上的sip協(xié)議進(jìn)行sdp協(xié)商。
FS怎么做到不同端點(diǎn)之間的轉(zhuǎn)換呢?主要通過sip_profile來進(jìn)行擴(kuò)展,將SIP會(huì)話的流程轉(zhuǎn)變成會(huì)話的有限態(tài)機(jī)來進(jìn)行維持。將協(xié)商的參數(shù)存于臨時(shí)會(huì)話結(jié)構(gòu)上,在FS上針對(duì)每個(gè)通話建立一個(gè)Session,每個(gè)參與的端點(diǎn)都做為其中一條Leg生成一個(gè)Channel,綁定到Session上,針對(duì)媒體如果有加密先進(jìn)行解密,有編碼的再進(jìn)行解碼,最終都會(huì)轉(zhuǎn)換成L16線性脈沖編碼存于緩沖區(qū),當(dāng)雙邊媒體通道打通時(shí)互相取對(duì)端的緩沖區(qū)數(shù)據(jù)進(jìn)行傳遞,到對(duì)端端點(diǎn)后再根據(jù)協(xié)商的格式進(jìn)行編碼,如果需要媒體流加密的再進(jìn)行加密,如果單邊接通FS也能主動(dòng)play到對(duì)端,如果需要對(duì)媒體進(jìn)行轉(zhuǎn)儲(chǔ)采用mediaBug進(jìn)行媒體轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)一路給錄音模塊或文件存儲(chǔ)模塊進(jìn)行儲(chǔ)存。WEB服務(wù)端會(huì)通過jssip來封裝SIP協(xié)議棧并通過瀏覽器來加載WebRTC能力進(jìn)行媒體協(xié)商,協(xié)商成功后Browser直接和FS進(jìn)行媒體交換。如下圖:
以上限于篇幅,分別點(diǎn)了一下FS做為一個(gè)小型的PBX的構(gòu)建網(wǎng)元,以及如何協(xié)同工作的,其中的每一個(gè)知識(shí)點(diǎn)展開講都比較大,比如:FS中的核心構(gòu)造有哪些,是如何工作的;分別有哪些端點(diǎn),主要完成了哪些工作;它的編解碼模塊;它的帳號(hào)認(rèn)證模塊;它的撥號(hào)計(jì)劃模塊;它的內(nèi)部三級(jí)隊(duì)列的事件分發(fā)機(jī)制;它的ESL事件驅(qū)動(dòng)內(nèi)聯(lián)/外聯(lián)模式如何進(jìn)行主控;還有和AI是如何打通的,如何實(shí)現(xiàn)這樣的模塊,等等。如果后邊有機(jī)會(huì)會(huì)進(jìn)行一系列連載,深度剖析一下這款優(yōu)秀的工具。接下來進(jìn)階篇主要講一下云呼叫中心是如何構(gòu)建的。
進(jìn)階篇
市面上大部分呼叫中心類型產(chǎn)品有幾類做法,坐席端要么針對(duì)各類操作系統(tǒng)開發(fā)相關(guān)的APP或SDK,要么使用OCX控件來集成終端音頻能力,采用pjsip等類似的開源或自研協(xié)議棧在udp/tcp通道上傳輸標(biāo)準(zhǔn)的sip協(xié)議,連接到指定的FreeSWITCH軟交換,另一端采用E1線從運(yùn)營商接入使用OpenVox板卡或其它廠商的硬件轉(zhuǎn)換網(wǎng)關(guān)把pri信令轉(zhuǎn)成sip信令接入。
對(duì)于軟交換核心的穩(wěn)定性主要是采用的雙機(jī)熱備方案,如下圖所示,這也是最常規(guī)的接入方式和高可用的方案。對(duì)于軟交換來說主從實(shí)例能共用DB或Cache中的同一份Session數(shù)據(jù),存儲(chǔ)了雙邊通道的協(xié)商信息,我們都知道FreeSWITCH是一個(gè)有狀態(tài)的服務(wù),所有會(huì)話信息都在內(nèi)存中處理,也會(huì)同步到db或Cache,當(dāng)主節(jié)點(diǎn)掛掉后,從節(jié)點(diǎn)接管時(shí)會(huì)初始化DB或者Cache中的會(huì)話信息進(jìn)行會(huì)話實(shí)例的重新加載。
對(duì)于終端來說在服務(wù)切換時(shí)有短暫的無聲情況,如果媒體端口在防火墻等設(shè)備上仍然是暢通時(shí)直接就可以恢復(fù)媒體流,當(dāng)發(fā)現(xiàn)端口不通時(shí)會(huì)通過reinvite來重新協(xié)商,整個(gè)過程非常短暫。這種模式是最流行的一種高可用方案,也是硬件廠商最常使用的一種方式。
賬號(hào)體系可以用Doc文檔或者DB方式管理,IVR樹,ACD坐席分配,QUEUE入隊(duì),Cdr計(jì)費(fèi)話單生成等管理,全部使FreeSWITCH自身的模塊功能來構(gòu)建,這種方式短小精悍,高內(nèi)聚。它的最大的問題就是并發(fā)能力有限,在8U16C的主機(jī)上做過測試,在做過深度調(diào)優(yōu)的情況下能支撐1800Chennel通話音質(zhì)無損失。單個(gè)小企業(yè)內(nèi)部支撐完全沒有問題。
當(dāng)我們要做一個(gè)云呼叫中心提供給眾多企業(yè)一起使用,需要萬級(jí)甚至十萬級(jí)同時(shí)并發(fā)通話時(shí),上述方式已經(jīng)很難支撐。FreeSWITCH官方作者也講述了這類問題,并表示現(xiàn)有的架構(gòu)體系很難支持Cluster方式,需要自己來解決。
我們不需要發(fā)明創(chuàng)造,完全可以借鑒Redis的Proxy集群方案和Dubbo服務(wù)發(fā)現(xiàn)方案,組合使用即是一個(gè)能級(jí)聯(lián)分布,橫向擴(kuò)展性能無衰減,服務(wù)上線能自動(dòng)發(fā)現(xiàn),服務(wù)異常能自動(dòng)下線的高可用軟交換集群,如下圖:
先講一下幾個(gè)關(guān)鍵的網(wǎng)元節(jié)點(diǎn),其中媒體交換中心集群、路由中心集群、接入中繼集群都是使用FreeSWITCH來實(shí)現(xiàn),接入代理集群都是使用Kamailio來實(shí)現(xiàn)。最核心的就是:
- fs-media:媒體交換中心集群;
- fs-router:路由中心集群;
- fs-tandem:接入中繼網(wǎng)關(guān);
- kama-pstn:企業(yè)接入代理;
- kama-wss:坐席接入代理。
為什么接入代理使用Kamailio而不是FreeSWITCH呢?它們的接入準(zhǔn)標(biāo)都是一樣的,原則上來講都可以作為接入代理,但是他們的側(cè)重點(diǎn)不同,FreeSWITCH更注重媒體的處理,及號(hào)碼變換,Kamailio更注重的是NAT網(wǎng)絡(luò)穿透,信令路由尋址。Kamailio可以在呼叫的整個(gè)流程中分析、存儲(chǔ)、變換SIP協(xié)議頭部或包體中的各項(xiàng)參數(shù)。比如:在NAT環(huán)境中SIP請(qǐng)求在每經(jīng)過一個(gè)代理節(jié)點(diǎn)都會(huì)在頭部添加一項(xiàng)Record-Route/Route,在響應(yīng)消息時(shí)每經(jīng)過一個(gè)代理節(jié)點(diǎn)都會(huì)在頭部刪除一項(xiàng)Record-Route/Route,同時(shí)會(huì)在頭部攜帶各種標(biāo)識(shí),也會(huì)攜帶contact,from,to等字段。
當(dāng)有NAT環(huán)境時(shí)需要在代理上主動(dòng)來對(duì)這些字段對(duì)內(nèi)外網(wǎng)的IP,Port等做替換。如果未進(jìn)行轉(zhuǎn)換,這條到達(dá)本網(wǎng)關(guān)的消息會(huì)路由到錯(cuò)誤的IP,Port上去,最終的結(jié)果就是信令不通,協(xié)商超時(shí)等不成功。對(duì)于網(wǎng)絡(luò)環(huán)境這塊兒是傳統(tǒng)通信最大的問題,沒有統(tǒng)一規(guī)范和標(biāo)準(zhǔn)可尋,只能實(shí)際拔測抓現(xiàn)場報(bào)文來分析并解決問題。如下圖所示,即本方案的代理接入:
在企業(yè)內(nèi)部一般都會(huì)采取媒體交換,CTI集成系統(tǒng)全都部署在內(nèi)網(wǎng),坐席終端一般也在同一辦公網(wǎng)環(huán)境,也有在家等公網(wǎng)場合,這種情況是最為復(fù)雜的,因?yàn)榧扔?span id="dns2f32" class="candidate-entity-word" data-gid="1623363">公網(wǎng),又要支持內(nèi)網(wǎng)。我們可以將媒體全部監(jiān)聽在內(nèi)網(wǎng)IP, 在代理出口使用Kamailio RTPEngine來構(gòu)建一個(gè)SBC網(wǎng)元做信令和媒體的代理,如果遇到對(duì)稱型網(wǎng)絡(luò)NAT類型,無法進(jìn)行NAT穿透時(shí),終端可以采取ICE接入。本圖是一個(gè)WebRTC終端的坐席代理側(cè),Web終端使用jssip來接入,我們使用Kamailio的ws模塊來解析并剝除協(xié)議內(nèi)容將解析出來的標(biāo)準(zhǔn)Sip再路由轉(zhuǎn)發(fā)給FreeSWITCH。
協(xié)議的下一跳即是fs-router集群了,fs-router的主要功能有兩點(diǎn),其一是:注冊(cè)路由的保持,當(dāng)有被叫時(shí)需要推送至客服端進(jìn)行尋址。其二是:會(huì)話中間消息的路由轉(zhuǎn)發(fā)層。首先要講的是從代理集群上的信令怎么尋址到fs-router集群的一臺(tái)具體的主機(jī)上呢?kama-wss會(huì)通過策略服務(wù)以Session為基本單位進(jìn)行分配,分配規(guī)則是通過fs-router節(jié)點(diǎn)實(shí)時(shí)監(jiān)測的并發(fā)會(huì)話數(shù)來取最輕負(fù)載優(yōu)先。當(dāng)然也支持隨機(jī),hash,順序,加權(quán)隨機(jī)等機(jī)制。只有在invite消息即會(huì)話開始時(shí)會(huì)選擇一個(gè)節(jié)點(diǎn),在會(huì)話的整個(gè)生命周期內(nèi)都落在本節(jié)點(diǎn)上。同時(shí)并將Session記錄到公共緩存,當(dāng)本節(jié)點(diǎn)宕機(jī)時(shí),在會(huì)話過程中的指令尋址到fs-router集群時(shí)會(huì)通過緩存找到router節(jié)點(diǎn),通過zk的存活檢測最終會(huì)發(fā)現(xiàn)本節(jié)點(diǎn)已無效,在此刻會(huì)重新分配fs-router節(jié)點(diǎn),reinvite進(jìn)行重新協(xié)商然后恢復(fù)通話。
為什么需要存在fs-router這個(gè)節(jié)點(diǎn)呢?它到底能解決什么問題?主要是為了解決單臺(tái)媒體服容量上限及數(shù)據(jù)傾斜問題。如果沒有這個(gè)路由節(jié)點(diǎn),當(dāng)前集群流量以租戶為單位,可以通過tenantId來劃分流量,將一個(gè)企業(yè)下的所有通話都引流到一個(gè)軟交換媒體服上去,這樣做有一個(gè)弊端,當(dāng)一個(gè)企業(yè)的客服數(shù)或并發(fā)通話量過大時(shí)就會(huì)超出一臺(tái)媒體服的容量上限,按租戶來劃分流量就會(huì)導(dǎo)致數(shù)據(jù)傾斜,資源使用不均衡。引入fs-router就是為了解決此問題,它可以將注冊(cè)和媒體分離,原來按租戶來進(jìn)行的流量劃分就可以做到粒度更小的按會(huì)話來劃分,只需要將同一會(huì)話參與的兩端或多端引流到同一臺(tái)媒體服,會(huì)話生命周期結(jié)束后就會(huì)重新分配。
協(xié)議的再下一跳即是fs-media集群了尋址方式和kama-wss到fs-router類似,同樣是借助策略服務(wù)及狀態(tài)服務(wù)來發(fā)現(xiàn)服務(wù)的可用性及負(fù)載情況來在初始會(huì)話時(shí)選擇一個(gè)具體節(jié)點(diǎn),在會(huì)話的過程中通過緩存來進(jìn)行真正尋址,當(dāng)有服務(wù)異常的情況做同樣的處理。唯一不同的就是fs-router和fs-media是雙向?qū)Φ鹊姆?wù)接入方式。對(duì)于媒體交換節(jié)點(diǎn)的主控服務(wù)采取ESL內(nèi)聯(lián)模式,主要實(shí)現(xiàn)了一個(gè)業(yè)務(wù)層與通信層的一個(gè)離散、聚合,協(xié)議轉(zhuǎn)換包裝,業(yè)務(wù)拆解與分發(fā)的主控服務(wù)如下圖所示:
fs-media集群又可以按租戶來進(jìn)行劃分也可以按功能來進(jìn)行劃分,真正做到租戶間的物理隔離及功能間的物理隔離,可以分為通用媒體集群,灰度媒體集群,外呼機(jī)器人媒體集群,呼入機(jī)器人媒體集群,預(yù)測試外呼媒體集群,電話會(huì)議媒體集群,內(nèi)部通話媒體集群等,可隨意按需定制,如下圖所示,為媒體集群節(jié)點(diǎn)注冊(cè)時(shí)的數(shù)據(jù)模型,主要通過租戶表來區(qū)分企業(yè),通過應(yīng)用節(jié)點(diǎn)表來區(qū)分FS節(jié)點(diǎn)為路由節(jié)點(diǎn)還是媒體節(jié)點(diǎn),通過企業(yè)應(yīng)用表來做節(jié)點(diǎn)和企業(yè)關(guān)聯(lián)可做到以企業(yè)粒度隨意切換。媒體集群是有狀態(tài)的,但此種設(shè)計(jì)可以支持熱切換,如正在通話中從一個(gè)集群切至另一個(gè)集群時(shí),本次通話仍在切換前的集群上工作,新建的會(huì)話都會(huì)直接建立在新的集群上,當(dāng)老的通話全部結(jié)束后再轉(zhuǎn)移到新集群,需要注意的是如果服務(wù)要下線必須得先unregister,觀察流量為0時(shí)才能真正下線。
協(xié)議的再下一跳就是線路落地,云呼叫中心的線路落地采取兩種方式,一種是混合云的方式,另一種是純?cè)频姆绞健?/span>混合云是適應(yīng)傳統(tǒng)企業(yè)內(nèi)部有拉過運(yùn)營商E1線專線,或者有自己的PBX系統(tǒng),可以方便的接入到云呼叫中心上來,這種方式和企業(yè)內(nèi)部復(fù)雜的網(wǎng)絡(luò)有關(guān),所以在云端也采取了對(duì)網(wǎng)絡(luò)穿透適配性更好的kama-pstn代理來對(duì)接,可以無任何限制的對(duì)NAT環(huán)境做協(xié)議變換。而純?cè)频姆绞街饕呛透鞔筮\(yùn)營商進(jìn)行對(duì)接,能滿足企業(yè)客戶線上操作即可接入,省去很多不必要的技術(shù)對(duì)接工作,達(dá)到即開即用的目的,由于都是對(duì)等連接,但是運(yùn)營商過來的號(hào)碼關(guān)系比較復(fù)雜,但網(wǎng)絡(luò)情況比較單一,采用了fs-tandem中繼網(wǎng)關(guān)的方式來對(duì)接,重點(diǎn)保障安全認(rèn)證和號(hào)碼變換。
下圖是一通呼叫從坐席注冊(cè),用戶到坐席的一個(gè)接入流程,遵循SIP的流程機(jī)制,就不展開討論了。
總結(jié)
點(diǎn):我們先從FreeSWITCH這個(gè)核心點(diǎn)講述了它是一個(gè)核心軟交換應(yīng)用,及功能特性。
線:又從搭建一個(gè)小型的PBX及功能調(diào)測以及可以連接哪些終端來連成一條可P2P的音視頻通話的線。
面:繼續(xù)通過講企業(yè)內(nèi)部的呼叫中心應(yīng)用展開成面討論到了一個(gè)呼叫中心應(yīng)具備的基本要素。
體:最后通過云呼叫中心的高可用,分布式,高性能,多租戶的架構(gòu)設(shè)計(jì)方案匯聚成體,詮釋了一套商業(yè)化可行的體系。
本文我們只從總體來講解了一下呼叫中心云化必須具備的設(shè)計(jì)方案。云呼叫中心要關(guān)注或要解決的問題點(diǎn)還很多,通話質(zhì)量是一個(gè)不可或缺的關(guān)注點(diǎn),如何監(jiān)測平臺(tái)整體性的通話質(zhì)量,如何進(jìn)行通話質(zhì)量調(diào)優(yōu),是流媒體平臺(tái)必不可少的研究課題。
同智能化AI機(jī)器人接軌也是一個(gè)比較熱門的話題,如何實(shí)時(shí)質(zhì)檢,如何智能推薦話術(shù)輔助辦公,如何進(jìn)行通話預(yù)測,如何進(jìn)行智能監(jiān)控及風(fēng)控管理,是當(dāng)下做商業(yè)服務(wù)一體化應(yīng)用必須研究的課題。呼叫中心雖然是一個(gè)有年代感的應(yīng)用系統(tǒng),但是它隨著時(shí)代的變遷也正日益茁壯的成長,給企業(yè)帶來的價(jià)值不可小覷,讓我們一起擁抱變化迎接新的挑戰(zhàn)吧!
作者:楊先君
來源:微信公眾號(hào):網(wǎng)易智企技術(shù)
出處:https://mp.weixin.qq.com/s/_4zzmPh2FfFJSo-VuAoN0w