MRCP(V2)的消息組成
MRCP(V2)的交互過(guò)程可以分為三部分
? ? 1.SIP交互 : Session Initiation Protocol弟胀,縮寫(xiě)SIP,正如協(xié)議的名稱(chēng)所言,用于初始化會(huì)話配喳。MRCP交互和RTP交互都基于此會(huì)話進(jìn)行缩滨。交互的媒體能力和地址都基于SIP消息攜帶的SDP信息進(jìn)行協(xié)商翘县。SIP消息一般基于UDP協(xié)議交互帜羊。
? ? 2.MRCP消息交互:控制具體的基于語(yǔ)音的操作(語(yǔ)音識(shí)別、語(yǔ)音合成等)洋腮,同時(shí)傳遞操作的信息和結(jié)果(識(shí)別結(jié)果傳遞箫柳、需要合成語(yǔ)音的文本內(nèi)容等)。MRCP消息一般通過(guò)TCP協(xié)議交互啥供。
? ? 3.RTP消息交互:傳遞操作中的音頻流悯恍。RTP消息一般基于UDP協(xié)議交互。
MRCP(V2)的三種子協(xié)議交互依賴(lài)
????????作為一個(gè)MRCP Server滤灯,包含了上面的協(xié)議的三部分坪稽。如何才能對(duì)同時(shí)包含了三中交互方式的協(xié)議進(jìn)行均衡負(fù)載和容錯(cuò)呢。我們即需要保證同一會(huì)話的SIP消息轉(zhuǎn)發(fā)給同一節(jié)點(diǎn)鳞骤,還需要保證與該會(huì)話綁定的MRCP消息和RTP消息都走對(duì)應(yīng)的節(jié)點(diǎn)。
????????看似復(fù)雜黍判,其實(shí)很簡(jiǎn)單豫尽,我們只需要對(duì)SIP交互進(jìn)行負(fù)載均衡即可。通過(guò)觀察SIP交互內(nèi)容顷帖,我們不難看到美旧,MRCP消息和RTP消息的交互地址,都是在SIP交互過(guò)程中贬墩,由SDP協(xié)商的榴嗅。也即,MRCP消息的交互和RTP消息的交互的雙方地址都是基于SIP消息得到的陶舞。
如從下面MRCP Server返回的200SIP消息可以看出嗽测,MRCP消息交互使用9.75.181.154:1544,而媒體則使用9.75.181.154:5028。
只要我們SIP協(xié)商成功肿孵,那么對(duì)應(yīng)的MRCP 和 RTP交互是基于協(xié)商地址直接交互的唠粥。因此只要做到了SIP消息的負(fù)載均衡,就做到了MRCP會(huì)話級(jí)別的負(fù)載均衡停做。
MRCP(V2)的負(fù)載方案
下面我們來(lái)談?wù)勅绾芜M(jìn)行負(fù)載均衡晤愧。
方案一: 使用NGINX進(jìn)行UDP代理
? ? Nginx 1.9版本增加了Stream模塊,支持4層代理蛉腌,
如下圖所示官份,只需要配置stream模塊進(jìn)行代理即可只厘。nginx會(huì)自動(dòng)均衡請(qǐng)求到負(fù)載節(jié)點(diǎn)。這里有幾個(gè)配置項(xiàng)要補(bǔ)充描述一下:
proxy_responses : UDP轉(zhuǎn)發(fā)時(shí)舅巷,此配置項(xiàng)決定了nginx在轉(zhuǎn)發(fā)一個(gè)nginx請(qǐng)求后羔味,反向轉(zhuǎn)發(fā)多少個(gè)響應(yīng)后認(rèn)為釋放通道。如下圖所示悄谐,A給B發(fā)起一個(gè)請(qǐng)求后介评,B返回了10個(gè)響應(yīng),NGINX將10個(gè)響應(yīng)轉(zhuǎn)回到A后會(huì)釋放通道爬舰,NGINX的臨時(shí)轉(zhuǎn)發(fā)端口將被釋放们陆,之后B的下一個(gè)返回消息將無(wú)法轉(zhuǎn)回A。
proxy_timeout : UDP轉(zhuǎn)發(fā)時(shí)情屹,如果A從端口p1通過(guò)ngxin向B發(fā)送了請(qǐng)求坪仇,100s內(nèi)的同源ip端口的請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到同一節(jié)點(diǎn),同理在此期間能否原路返回響應(yīng)垃你。超時(shí)釋放通道椅文。
上面兩個(gè)配置同時(shí)存在是,通道存在時(shí)長(zhǎng)取最小值惜颇,即有配置觸發(fā)了釋放通道皆刺,通道即被釋放。
有的文章可能會(huì)使用客戶端ip hash的方式進(jìn)行均衡凌摄,以保證會(huì)話一致性羡蛾。實(shí)際上通過(guò)上面的配置,已經(jīng)能夠保證超時(shí)時(shí)間內(nèi)的同會(huì)話請(qǐng)求轉(zhuǎn)發(fā)到同一節(jié)點(diǎn)锨亏。反而使用ip hash時(shí)痴怨,需要考慮如何在機(jī)器數(shù)量不多時(shí),使多個(gè)ip hash分部到不同節(jié)點(diǎn)上(這一塊未仔細(xì)研究)器予。
關(guān)于容錯(cuò)浪藻,nginx會(huì)自動(dòng)檢查分發(fā)服務(wù)地址是否可達(dá),如果不可達(dá)乾翔,會(huì)自動(dòng)剔除該節(jié)點(diǎn)爱葵。當(dāng)然,如果在會(huì)話中節(jié)點(diǎn)崩潰末融,進(jìn)行中的會(huì)話會(huì)將無(wú)法繼續(xù)提供服務(wù)钧惧,但系統(tǒng)不會(huì)進(jìn)入故障狀態(tài),后續(xù)新會(huì)話會(huì)轉(zhuǎn)發(fā)到剩余正常節(jié)點(diǎn)勾习。
方案二:使用開(kāi)源SIP框架浓瞪,如OpenSips等。
? ? OpenSips的部署可以參考官網(wǎng)巧婶,需要安裝db進(jìn)行均衡配置乾颁,同時(shí)通過(guò)route腳本進(jìn)行分發(fā)控制涂乌。總體來(lái)說(shuō)個(gè)人覺(jué)得成本稍大英岭。當(dāng)前采用了方案一湾盒。