前言
兩年來(lái),新冠疫情給我們的工作生活帶來(lái)了巨大影響,社會(huì)各界都面臨著嚴(yán)峻的挑戰(zhàn)。汽車之家敏銳的洞察到降低人力成本,篩選高優(yōu)客戶、提高意向成交率已經(jīng)成為各主機(jī)廠的迫切需求,因此,智能外呼平臺(tái),應(yīng)運(yùn)而生。
通過(guò)對(duì)市面上的幾款外呼平臺(tái)調(diào)研,發(fā)現(xiàn)有很多業(yè)務(wù)場(chǎng)景并不支持,不僅可擴(kuò)展性差、而且維護(hù)成本高,所以為了更好地承接主機(jī)廠業(yè)務(wù),滿足客戶定制化需求,決定研發(fā)自己的智能外呼平臺(tái)。
常見(jiàn)的外呼平臺(tái)都是基于VoIP(Voice over Internet Protocol,縮寫為VoIP)實(shí)現(xiàn)的,VoIP是基于IP的語(yǔ)音傳輸,是一種語(yǔ)音通話技術(shù),經(jīng)由網(wǎng)際協(xié)議(IP)來(lái)達(dá)成語(yǔ)音通話與多媒體會(huì)議。
VoIP電話
不同于傳統(tǒng)的電話,VoIP是一種新興的電話通信方式。它是一種把語(yǔ)音技術(shù)集成在IP協(xié)議中,通過(guò)互聯(lián)網(wǎng)進(jìn)行傳輸?shù)囊环N全新的通信方式,其成本遠(yuǎn)低于傳統(tǒng)電話。
- VoIP電話優(yōu)點(diǎn)
- VoIP平臺(tái)的選擇
目前國(guó)內(nèi)比較流行和擁有大量活躍用戶的是Freeswitch(https://freeswitch.org/)和 Asterisk(http://www.asterisk.org/)
下圖為二者的簡(jiǎn)單對(duì)比:
結(jié)論:基于以上調(diào)研和對(duì)比,發(fā)現(xiàn)Freeswitch的資料相對(duì)完備,學(xué)習(xí)成本低,并且已有較多的成功案例,很多外呼供應(yīng)商都采用Freeswitch作為軟交換平臺(tái)。因此,F(xiàn)reeswitch也 將是我們更優(yōu)的選擇。
初識(shí)Freeswitch
Freeswitch是一個(gè)開源的電話交換平臺(tái)。官方給它的定義是——世界上第一個(gè)跨平臺(tái)的、伸縮性極好的、免費(fèi)的、多協(xié)議的電話軟交換平臺(tái)。在Freeswitch出現(xiàn)之前,軟交換技術(shù)基本上掌握在少數(shù)通信企業(yè),集成在硬件設(shè)備上整機(jī)出售,價(jià)格昂貴。需要大量的專業(yè)積累才能入門,使用者基本上偏運(yùn)維,無(wú)法掌握實(shí)質(zhì)的技術(shù)。
當(dāng)Freeswitch以BypassMedia(旁路模式:此模式下freeswitch更像是一個(gè)信令proxy,媒體不會(huì)通過(guò)freeswitch,sdp消息體不做修改,沒(méi)有錄音,二次撥號(hào)等功能)運(yùn)作時(shí),它和其它VoIP通信原理一致,同樣是點(diǎn)到點(diǎn)的實(shí)時(shí)通信。負(fù)責(zé)通話雙方的媒體協(xié)商,交換RTP端口,編解碼等信息,詳細(xì)的SIP協(xié)議或協(xié)商流程可參見(jiàn):RFC3261文檔,源碼及編譯安裝可以參見(jiàn)Freeswitch官網(wǎng)。
- Freeswitch運(yùn)行機(jī)制
Freeswitch內(nèi)部使用線程模型來(lái)處理并發(fā)請(qǐng)求,每個(gè)連接都在單獨(dú)的線程中進(jìn)行處理,不同的線程間通過(guò)Mutex互斥訪問(wèn)共享資源,并通過(guò)消息和異步事件等方式進(jìn)行通信。這種架構(gòu)能處理很高的并發(fā), 并且在多核環(huán)境中運(yùn)算能均勻地分布到多顆CPU或單CPU的多個(gè)核心上。Freeswitch的核心非常短小精悍,這也是其保持穩(wěn)定的關(guān)鍵。絕大部分應(yīng)用層的功能都在外圍的模塊中實(shí)現(xiàn)。外圍模塊是可以動(dòng)態(tài)加載(以及卸載)的,在實(shí)際應(yīng)用中可以只加載用到的模塊。外圍模塊通過(guò)核心提供的Public API與核心進(jìn)行通信,而核心則通過(guò)回調(diào)(或稱鉤子)機(jī)制執(zhí)行外圍模塊中的代碼。
- 開發(fā)模式的選擇
Freeswitch的開發(fā)模式有兩種:
- 面向服務(wù)器開發(fā),這種開發(fā)模式是基于腳本內(nèi)嵌的方式,主要開發(fā)lua腳本或者使用C語(yǔ)言開發(fā)mod,開發(fā)人員的學(xué)習(xí)成本高,不易維護(hù),腳本之間無(wú)法復(fù)用;
- 面向客戶端開發(fā),F(xiàn)reeswitch支持多種語(yǔ)言,開發(fā)人員可以使用自己熟悉的開發(fā)語(yǔ)言(java)。通過(guò)調(diào)用核心API的方式,可以控制整個(gè)會(huì)話流程。
綜上所述:雖然lua腳本或C語(yǔ)言的執(zhí)行效率更高,但是客戶端的開發(fā)模式更加方便定制化開發(fā),易于開發(fā),況且把復(fù)雜的業(yè)務(wù)邏輯放在Freeswitch服務(wù)端不利于后續(xù)的維護(hù)和擴(kuò)展。面向客戶端開發(fā)有2種連接模式:內(nèi)連(Inbound)模式和外連(Outbound)模式。這里我們僅說(shuō)下內(nèi)連模式
在內(nèi)連模式下,F(xiàn)reeswitch作為一個(gè)服務(wù)器,而用戶的程序可以作為一個(gè)TCP Client主動(dòng)連接到Freeswitch上。同樣,F(xiàn)reeswitch允許多個(gè)客戶端連接。每個(gè)客戶端連接上來(lái)以后,可以訂閱Freeswitch的內(nèi)部事件,實(shí)現(xiàn)可定制化開發(fā)。
例如:電話轉(zhuǎn)接、定制化彩鈴等都可以通過(guò)內(nèi)聯(lián)模式實(shí)現(xiàn)控制。
- Freeswitch下基于sip協(xié)議的呼叫流程
下面給出了上述調(diào)用流程的逐步解釋
- 發(fā)送到代理服務(wù)器的INVITE請(qǐng)求負(fù)責(zé)啟動(dòng)會(huì)話。
- 代理服務(wù)器立即向呼叫者(Alice)發(fā)送 100 Trying 響應(yīng)以停止INVITE請(qǐng)求的重傳。
- 代理服務(wù)器在位置服務(wù)器中搜索Bob的地址。在獲得地址之后,它進(jìn)一步轉(zhuǎn)發(fā)INVITE請(qǐng)求。
- 此后,由Bob產(chǎn)生的 180響鈴(臨時(shí)響應(yīng))被返回給Alice。
- Bob在接聽電話后立即生成 200 OK 響應(yīng)。Alice收到 200 OK 時(shí),Bob會(huì)收到來(lái)自Alice的 ACK 。
- 同時(shí),會(huì)話建立并且RTP分組(對(duì)話)開始從兩端流動(dòng)。
- 在對(duì)話之后,任何參與者(Alice或Bob)可以發(fā)送 BYE 請(qǐng)求以終止會(huì)話。BYE 直接從Alice到Bob繞過(guò)代理服務(wù)器。
- 最后,Bob發(fā)送 200 OK 響應(yīng)以確認(rèn)BYE并且會(huì)話終止。
- 在上述基本呼叫流程中,三個(gè)事務(wù)(標(biāo)記為1,2,3)可用。
完整的呼叫(從INVITE到200 OK)稱為 Dialog 。
- Freeswitch主要配置文件
Freeswitch的核心底層代碼是由C語(yǔ)言編寫,如果需要重構(gòu)Freeswitch核心功能、基于Freeswitch二次開發(fā)軟交換,或者針對(duì)Freeswitch開發(fā)其他自定義模塊,則需要在符合Freeswitch開發(fā)規(guī)范的情況下進(jìn)行改造。而使用Freeswitch或者針對(duì)Freeswitch做esl應(yīng)用端開發(fā),則基本不需要更改Freeswitch底層代碼邏輯,F(xiàn)reeswitch是通過(guò)提供基于靜態(tài)xml的文件配置方式,來(lái)實(shí)現(xiàn)對(duì)Freeswitch所有功能的配置和調(diào)度控制。
撥號(hào)計(jì)劃(dialplan)是Freeswitch配置文件中至關(guān)重要的一部分,它的主要作用就是對(duì)電話進(jìn)行路由。就是當(dāng)一個(gè)用戶撥號(hào)時(shí),對(duì)用戶所撥的號(hào)碼進(jìn)行分析,進(jìn)而決定下一步該做 什么。如:可以撥打9197進(jìn)行接通音樂(lè)校驗(yàn),撥打1001不在線進(jìn)入語(yǔ)音信箱留言等,通過(guò)撥號(hào)計(jì)劃可以達(dá)到領(lǐng)編碼進(jìn)行功能的擴(kuò)展。
由于Freeswitch知識(shí)點(diǎn)較多,每一個(gè)知識(shí)點(diǎn)展開討論都比較大,以上篇幅僅把Freeswitch使用過(guò)程中的主要知識(shí)點(diǎn)做了介紹。接下來(lái)講解下Freeswitch服務(wù)中心的演化構(gòu)建。
Freeswitch 服務(wù)中心的演變
- 單Freeswitch服務(wù)(1.0)
在智能外呼服務(wù)從0到1的孵化過(guò)程中,如何保證各個(gè)功能點(diǎn)正確實(shí)現(xiàn),業(yè)務(wù)順利推進(jìn)是首先需要解決的核心問(wèn)題。一個(gè)簡(jiǎn)單的Freeswitch單體架構(gòu),是可以滿足智能機(jī)器人的外呼通話要求。
外呼機(jī)器人撥打流程:
- Freeswitch服務(wù)啟動(dòng)成功;
- 建立私有分機(jī)號(hào),作為機(jī)器人賬號(hào);
- 機(jī)器人通過(guò)撥號(hào)規(guī)則調(diào)用Freeswitch;
- Freeswitch接收到撥號(hào)后調(diào)用配置的網(wǎng)關(guān),把要呼叫的號(hào)碼經(jīng)防火墻后,發(fā)送給線路運(yùn)營(yíng)商;
- 線路商收到呼叫請(qǐng)求后,連接用戶手機(jī)號(hào),最終建立外呼機(jī)器人到用戶手機(jī)的通信通道。
單體架構(gòu)問(wèn)題:
- 1. 存在單點(diǎn)故障風(fēng)險(xiǎn),從而會(huì)導(dǎo)致整個(gè)外呼系統(tǒng)癱瘓;2. 并發(fā)能力有限。
- 負(fù)載均衡(2.0)
隨著業(yè)務(wù)的的增長(zhǎng),外呼量會(huì)越來(lái)越大,對(duì)服務(wù)的穩(wěn)定性要求也越來(lái)越高,對(duì)Freeswitch的高可用集群的訴求也被提上日程。
Freeswitch的高可用部署方式有兩種:主備切換和負(fù)載均衡,官方文檔介紹的主備切換部署是采用Corosync & Pacemaker,負(fù)載均衡采用前置opensips。
為了解決1.0 版本所面臨的性能不足和單點(diǎn)故障風(fēng)險(xiǎn),引入opensips前置于Freeswitch服務(wù)作為信令負(fù)載。
Freeswitch負(fù)載均衡架構(gòu)圖如上圖所示,使用opensips服務(wù)作為負(fù)載控制端。
工作流程:
- 外呼請(qǐng)求通過(guò)opensips服務(wù)動(dòng)態(tài)分配可用的Freeswitch服務(wù);
- Freeswitch接入mysql數(shù)據(jù)庫(kù),存儲(chǔ)雙邊通道信息,共用同一份Session數(shù)據(jù),保持通話;
- 客戶端與Freeswitch服務(wù)直接建立連接;
- 外呼服務(wù)接收到轉(zhuǎn)人工請(qǐng)求,直接通過(guò)ESL調(diào)用App命令進(jìn)行撥號(hào)路由轉(zhuǎn)接。
當(dāng)我們的服務(wù)中心需要提供給眾多的主機(jī)廠業(yè)務(wù)一起使用時(shí)候,需要萬(wàn)級(jí)甚至十萬(wàn)級(jí)同時(shí)并發(fā)通話時(shí),上述方式很難支持。
新的的問(wèn)題緊隨而至:1. 每新增一臺(tái)服務(wù)器都需要和線路商對(duì)接,增加了對(duì)接的難度;2. 每新增一臺(tái)服務(wù)器,保持端口一致的情況下,需要占用一個(gè)公網(wǎng)ip地址。
- 匯接局模式+負(fù)載均衡(3.0)
上述2.0方案中,隨著外呼業(yè)務(wù)量的增多,并發(fā)量的增大,相應(yīng)需要部署的Freeswitch服務(wù)也會(huì)越來(lái)越多,從而導(dǎo)致公網(wǎng)ip使用成本上升。為了解決上述問(wèn)題,進(jìn)一步提升并發(fā)量,引入?yún)R接局+負(fù)載均衡的模式。
核心節(jié)點(diǎn):
- fs-router 路由中心
- fs-media 媒體交換中心
fs-router路由中心主要有2個(gè)功能點(diǎn),其一是:撥號(hào)尋址,線路對(duì)接。其二是:會(huì)話中間消息路由的轉(zhuǎn)發(fā)。
fs-media媒體交換中心主要作為媒體(通話語(yǔ)音)傳遞,以及ESL通過(guò)Api和命令的方式對(duì)fs-media的調(diào)用。工作流程:
- 外呼請(qǐng)求通過(guò)opensips服務(wù)動(dòng)態(tài)分配可用的freeswitch服務(wù);
- fs-media接入mysql數(shù)據(jù)庫(kù),存儲(chǔ)雙邊通道信息,共用同一份Session數(shù)據(jù),以便保持通話;
- fs-mediaA/B(媒體終結(jié)服務(wù)) 經(jīng)撥號(hào)路由轉(zhuǎn)發(fā)給fs-router,由fs-router和線路商進(jìn)行sip信令的交互;
- 通信建立成功后由fs-mediaA/B直接和線路商進(jìn)行語(yǔ)音流傳遞;
- 客戶端通過(guò)fs-mediaA/B和用戶進(jìn)行通話。
匯接局+負(fù)載均衡模式的優(yōu)勢(shì):
- 匯接局模式,解決公網(wǎng)ip的占用問(wèn)題;
- 統(tǒng)一出局,簡(jiǎn)化線路商對(duì)接;
- 方便擴(kuò)展,簡(jiǎn)化新增服務(wù)配置;
- 由于集群式的部署,可以通過(guò)撥號(hào)方式的配置,針對(duì)不同的租戶,分配到不同的fs-media上,做到租戶之間的物理隔離。
總結(jié)
從第一次語(yǔ)音傳輸在1876年使用振鈴電路實(shí)現(xiàn),到現(xiàn)在通過(guò)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)的新型電話通信,歷經(jīng)了100多年,每一次通信的革新都離不開科技的進(jìn)步。VoIP網(wǎng)絡(luò)電話的興起,不僅預(yù)示著通信方式的革新,而且標(biāo)志著新一代呼叫中心成為了電話通信的寵兒。隨著Freeswitch服務(wù)中心的持續(xù)建設(shè),通信業(yè)務(wù)層面的價(jià)值會(huì)逐步提升,打破了交換技術(shù)掌握在少數(shù)通信企業(yè)的壁壘,降低了接入難度和使用成本。從1.0的單一服務(wù)到3.0的匯接局+負(fù)載均衡,在架構(gòu)升級(jí)后,F(xiàn)reeswitch服務(wù)中心不僅滿足高并發(fā),多租戶的業(yè)務(wù)場(chǎng)景,而且還保證了服務(wù)的高可用、簡(jiǎn)化了對(duì)接流程、方便了服務(wù)的擴(kuò)展。
- 展望
新一代的呼叫中心更多地融入了媒體渠道與通信渠道。未來(lái),在業(yè)務(wù)層面,F(xiàn)reeswitch服務(wù)中心不僅適應(yīng)于智能外呼平臺(tái),同時(shí)可滿足其他業(yè)務(wù)場(chǎng)景的使用。如:人機(jī)協(xié)同、在線客服、多人會(huì)議、視頻通話、排隊(duì)等待來(lái)電呼入等諸多場(chǎng)景。在技術(shù)層面,不僅要考慮性能和可用性的提升,而且還要兼顧其通話、視頻等質(zhì)量的提高。通過(guò)多fs-router(路由中心),進(jìn)一步提高它的性能和可用性。最后,追隨技術(shù)的腳步,迎接新的挑戰(zhàn)。
文章參考:
- SIP 教程:https://www.w3cschool.cn/session_initiation_protocol/
- Freeswitch權(quán)威指南