使用nginx反向代理MRCP SERVER

MRCP(V2)的消息組成

MRCP(V2)的交互過程可以分為三部分

? ? 1.SIP交互 : Session Initiation Protocol,縮寫SIP,正如協(xié)議的名稱所言,用于初始化會(huì)話。MRCP交互和RTP交互都基于此會(huì)話進(jìn)行。交互的媒體能力和地址都基于SIP消息攜帶的SDP信息進(jìn)行協(xié)商。SIP消息一般基于UDP協(xié)議交互。

? ? 2.MRCP消息交互:控制具體的基于語音的操作(語音識(shí)別、語音合成等),同時(shí)傳遞操作的信息和結(jié)果(識(shí)別結(jié)果傳遞、需要合成語音的文本內(nèi)容等)。MRCP消息一般通過TCP協(xié)議交互。

? ? 3.RTP消息交互:傳遞操作中的音頻流。RTP消息一般基于UDP協(xié)議交互。


MRCP(V2)的三種子協(xié)議交互依賴

????????作為一個(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ù)載均衡即可。通過觀察SIP交互內(nèi)容,我們不難看到,MRCP消息和RTP消息的交互地址,都是在SIP交互過程中,由SDP協(xié)商的。也即,MRCP消息的交互和RTP消息的交互的雙方地址都是基于SIP消息得到的。

如從下面MRCP Server返回的200SIP消息可以看出,MRCP消息交互使用9.75.181.154:1544,而媒體則使用9.75.181.154:5028。

MRCP的SIP協(xié)商

只要我們SIP協(xié)商成功,那么對(duì)應(yīng)的MRCP 和 RTP交互是基于協(xié)商地址直接交互的。因此只要做到了SIP消息的負(fù)載均衡,就做到了MRCP會(huì)話級(jí)別的負(fù)載均衡。


MRCP(V2)的負(fù)載方案

下面我們來談?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è)返回消息將無法轉(zhuǎn)回A。

proxy_timeout : UDP轉(zhuǎn)發(fā)時(shí),如果A從端口p1通過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ā)了釋放通道,通道即被釋放。


MRCP代理nginx配置

有的文章可能會(huì)使用客戶端ip hash的方式進(jìn)行均衡,以保證會(huì)話一致性。實(shí)際上通過上面的配置,已經(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ì)將無法繼續(xù)提供服務(wù),但系統(tǒng)不會(huì)進(jìn)入故障狀態(tài),后續(xù)新會(huì)話會(huì)轉(zhuǎn)發(fā)到剩余正常節(jié)點(diǎn)。



方案二:使用開源SIP框架,如OpenSips等。

? ? OpenSips的部署可以參考官網(wǎng),需要安裝db進(jìn)行均衡配置,同時(shí)通過route腳本進(jìn)行分發(fā)控制??傮w來說個(gè)人覺得成本稍大。當(dāng)前采用了方案一。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容