OpenSIPS 3.1 负载均衡 MRCP 服务器的实现

这篇具有很好参考价值的文章主要介绍了OpenSIPS 3.1 负载均衡 MRCP 服务器的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 方案设计

FreeSWITCH 通过 unimrcp 模块来对接 MRCP 服务器,该模块在启动时会根据 mrcp profile 配置文件创建 MRCP 客户端。在使用 MRCP 功能时,FreeSWITCH 通过 mrcp profile 的名称来指定要使用的 MRCP 客户端,进而决定要连接的 MRCP 服务器。在 MRCPv2 服务器的负载分发方案分析 中笔者分析到只要做好 SIP 信令的负载均衡就可以实现 MRCP 的负载均衡,基于此,一个可行的方案如下:

  1. FreeSWITCH 配置 mrcp 的 profile 指向 OpenSIPS 服务器,profile 中配置 ua 名称,作为 mrcp 请求的识别标志
  2. OpenSIPS 的脚本中判断 INVITE 请求中的 ua 名称,如果是 mrcp 请求,则做对应处理
  3. 在 OpenSIPS 数据库中插入对应的 mrcp 服务器地址记录,处理时调用 dispatcher 模块的 ds_select_dst 函数选中 mrcp 服务器,该函数会填充 $du 后将请求转发到 $du 指向的地址

OpenSIPS 3.1 负载均衡 MRCP 服务器的实现

2. 实现方式

2.1 FreeSWITCH 的配置

在 FreeSWITCH 的 conf/mrcp_profiles 目录 下新增一个配置文件,将其指向 OpenSIPS 服务器并指定 UA 名称,然后重启 FreeSWITCH

<include>
  <!-- UniMRCP Server MRCPv2 -->
  <profile name="opensips-tts-mrcp2" version="2">
    <!-- OpenSIPS 服务器地址 端口号-->
    <param name="server-ip" value="127.0.0.1"/>
    <param name="server-port" value="8060"/>

    <!-- FreeSWITCH IP、端口以及 SIP 传输方式 -->
    <param name="client-ip" value="$${local_ip_v4}" />
    <param name="client-port" value="5072"/>
    <param name="sip-transport" value="udp"/>

    <param name="speechsynth" value="speechsynthesizer"/>
    <param name="speechrecog" value="speechrecognizer"/>
    <!-- SIP 请求携带的 ua 名称 -->
    <param name="ua-name" value="OPENSIPS_TTS_MRCP_CLIENT"/> 

    <!-- Add any default MRCP params for SPEAK requests here -->
    <synthparams>
    </synthparams>

    <!-- Add any default MRCP params for RECOGNIZE requests here -->
    <recogparams>
      <!--param name="start-input-timers" value="false"/-->
    </recogparams>
  </profile>
</include>

2.2 OpenSIPS 3.1 的配置

  1. 注意,笔者在此强调了 OpenSIPS 版本为 3.1,这是因为 OpenSIPS 不同版本 api 有变化,如果版本不匹配本文中给出的脚本代码很可能发生异常
  2. 实践前读者必须保证 OpenSIPS 已经编译加载了 dispatcher 模块。如果 OpenSIPS 启动过程中报出模块找不到的异常,可以自行编译源码模块,然后将源码根目录下 modules目录中对应模块目录下的 so 动态库复制到异常提示的目录中即可
2.2.1 OpenSIPS 保存 MRCP 服务器地址

执行以下 SQL 语句,往 OpenSIPS 数据库的 dispatcher 表中插入目标 MRCP 服务器地址记录。这个表中 setid 是组概念的标识,脚本中调用 ds_select_dst 函数时需要指定该参数。如果在脚本中配置了 dispatcher 模块的数据库地址,则 OpenSIPS 启动时会从数据库中查询数据加载到内存,读者如有兴趣可参考 dispatcher 官方文档

dispatcher 表可以用 opensips-cli 工具 创建,由于权限问题无法创建时也可以在 OpenSIPS 源码根目录下的 scripts目录 中选择对应的数据库类型目录,查找该目录下相应的表创建文件,例如 scripts/mysql/dispatcher-create.sql,复制其内容到数据库中执行即可

INSERT INTO `dispatcher` (`setid`, `destination`, `state`, `weight`, `priority`, `attrs`, `description`) VALUES
    (19, 'sip:10.129.39.88:7010', 0, 1, 100, 'pstn=100', 'TTS_MRCP_CLIENT_FS_7010'),
    (19, 'sip:10.129.39.88:7011', 0, 1, 100, 'pstn=100', 'TTS_MRCP_CLIENT_FS_7011');
2.2.2 OpenSIPS 脚本开发

脚本最主要的分发代码如下,上文已经提到了具体处理,此处不再赘述,但仍然需要注意以下几点:

  1. 对于 FreeSWITCH 发起的 MRCP INVITE 请求,$rU 肯定为 null,如果脚本中有对这个变量的空判断,需要做相应规避。如读者对 OpenSIPS 的各个核心变量不了解,可前往 官方传送门
  2. OpenSIPS 启动时会对脚本进行语法检查,读者可以先用前台模式启动 OpenSIPS 然后观察启动日志,如有报错信息一一解决即可
route {
    # 省略无关代码 ...
    if (is_method("INVITE")) {
        xlog("ua = $ua , callid = $ci, fu = $fu , tu = $tu , ru = $ru , du =$du src:$si, $(rb{sdp.line,m})");
        $var(dlgPingTag) = "Pp";
        if ( $ua == "OPENSIPS_TTS_MRCP_CLIENT" ) {
               $var(dlgPingTag) = "";  # TTS 的SIP通道不能做 OPTION 探测
        }
        if ( !create_dialog("$var(dlgPingTag)")) {
            send_reply(500,"Internal Server Error");
            exit;
        }
        if ( $ua == "OPENSIPS_TTS_MRCP_CLIENT" ) {
             # 指定 setid 为 19,与插入 dispatcher 表的数据相匹配,选择可用的节点
             $var(lbRst) = ds_select_dst(19, 4);
             if($var(lbRst) == -1) {
                  xlog("Failed by dispatcher group_id: 19");
                  t_reply(480, "MRCP server Unavailable");
                  exit();
             }
             if ( $var(lbRst) > 0) {
                 $ru = "sip:" + $(du{uri.host}) + ":" + $dp;
                 xlog("[$fU->$rU] Route to $ru");
             } else {
                xlog("[$fU->$rU] No available server now");
                t_reply(480, "$var(node_type) Unavailable");
                exit();
             }
        } else {
            # 其他类型 INVITE 处理 .....
        }
    }
    route(relay);
}

route[relay] {
    # for INVITEs enable some additional helper routes
    if (isflagset("NAT")) {
        add_rr_param(";nat=yes");
    } 
    
    if (!t_relay()) {
        send_reply(500,"Internal Error");
    }
    exit;
}

2.3 实现效果

OpenSIPS 3.1 负载均衡 MRCP 服务器的实现文章来源地址https://www.toymoban.com/news/detail-455309.html

到了这里,关于OpenSIPS 3.1 负载均衡 MRCP 服务器的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nginx两台负载均衡服务器之间使用keepalived实现高可用

    单点故障:某个重要的功能只有一份,如果他出现问题,会导致全局不能使用 “高可用性”(High Availability,缩写为HA)用于描述系统或服务在面临故障、硬件或软件问题时能够继续正常运行的能力。高可用性的目标是最大程度地减少系统中断或停机时间,确保用户可以随时

    2024年02月09日
    浏览(31)
  • Web服务器群集:Nginx+Tomcat实现负载均衡与动静分离集群

    目录 一、理论 1.多实例 2.Nginx负载均衡 3.Nginx动静分离 4.配置Nginx+Tomcat负载均衡 5.配置Nginx+Tomcat动静分离集群 6.Nginx 四层代理配置 二、实验 1.配置Nginx+Tomcat负载均衡 2.、配置Nginx+Tomcat动静分离集群 三、问题 1.服务器群集与集群的区别 2.正向代理与反向代理的区别 四、总结 (

    2024年02月11日
    浏览(33)
  • Nginx多台服务器负载均衡

    一 操作步骤: 1.服务器IP 45.114.124.215   //主服务器(安装Nginx) 45.114.124.99     //从服务器(安装Nginx或Apache都可以) 2.保证2台服务器网络互通 3.在2台服务器上设置不同页面方便验证         3.1在主服务器添加一个可以访问的站点          3.2在次服务器添加一个站点,端口必

    2024年02月10日
    浏览(90)
  • 防火墙之服务器负载均衡

    防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安

    2024年02月07日
    浏览(78)
  • SRE之前端服务器的负载均衡

    今天和小伙伴们分享一些 前端服务器 的 负载均衡 技术 内容为结合 《 SRE Google运维解密》 整理: 涉及DNS 负载均衡 VIP 负载均衡 反向代理负载均衡 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我

    2024年02月13日
    浏览(31)
  • nginx反向代理服务器及负载均衡服务配置

    一、正向代理与反向代理 正向代理:是一个位于客户端和原始服务器(oricin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。 正向代理的典型用途是为在防火

    2024年02月04日
    浏览(36)
  • F5服务器负载均衡能力如何?一文了解

    但凡知道服务器负载均衡这个名词的,基本都知道 F5,因为负载均衡是 F5 的代表作,换句话来说,负载均衡就是由 F5 发明的。提到F5服务器负载均衡能力如何?不得不关注F5提出的关于安全、网络全面优化的解决方案,在其分布式云的产品中,全局F5服务器负载均衡的优势得

    2024年02月09日
    浏览(26)
  • 阿里云服务器F5负载均衡设置说明

    阿里云服务器F5负载均衡怎么设置?F5负载均衡和云服务器ECS绑定教程,先创建F5负载均衡器,然后创建后端服务器组,最后配置监听即可。可以设置IPv4和IPv6的负载均衡。阿里云服务器网aliyunfuwuqi.com整理 阿里云服务器F5负载均衡设置 教程,详细参考阿里云负载均衡页面:al

    2024年04月11日
    浏览(33)
  • Docker搭建Nginx+keepalived高可用负载均衡服务器

    一、背景 1.nginx高可用 在生产环境下,Nginx作为流量的入口,如果Nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。所以负责负载均衡、反向代理的服务(Nginx)为了提高处理性能,高可用,也需要集群部署。本期咋们采用 keepalived 和 Nginx实现高可用。 2.Kee

    2024年04月22日
    浏览(35)
  • 【网络面试(8)】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器

     接上一篇:【网络面试必问(7)】聊聊集线器、交换机和路由器  作为一个程序员,其实很少去了解http请求消息在到达服务器之前,所经过的众多组件的,今天借着机会聊一聊标题中提到的正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器等内容。 1.1 部署

    2024年02月22日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包