做呼叫中心或者语音导航等场景中,经常需要支持MRCP协议,目前主流的MRCP服务都借鉴了unimrcp的框架,并在该框架中编写自己的插件来实现ASR、TTS能力。
但是unimrcp并没有给出集群的解决方案,所以在工程化中,要解决单点问题才能达到真正的可用性。故这里使用nginx来代理sip消息的负载来实现unimrcp的负载,以TCP的sip协议为例:
在nginx.conf中添加sip消息的负载均衡:
stream {
upstream mrcp-server {
server 172.16.18.97:5060 max_fails=3 fail_timeout=30s;
server 172.16.18.98:5060 max_fails=3 fail_timeout=30s;
server 172.16.18.99:5060 max_fails=3 fail_timeout=30s;
}
access_log logs/access.log main;
server {
listen 5060;
proxy_connect_timeout 30s;
proxy_timeout 30s;
proxy_pass mrcp-server;
}
}
原理为:
1.sip消息通过nginx反向代理到节点后,节点正常处理sip消息
2.节点响应了sip消息后,返回给nginx相应的sip响应
3.nginx也将sip消息还给前端mrcp客户端
4.mrcp客户端根据sip消息中的节点ip和端口直连后面的节点,mrcp连接和udp连接则跳过了nginx
以上方式可以实现unimrcp的负载均衡