Freeswitch集群在智能外呼平台中的应用

原创 精选
开源
Freeswitch是一个开源的电话交换平台。官方给它的定义是——世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。

前言

两年来,新冠疫情给我们的工作生活带来了巨大影响,社会各界都面临着严峻的挑战。汽车之家敏锐的洞察到降低人力成本,筛选高优客户、提高意向成交率已经成为各主机厂的迫切需求,因此,智能外呼平台,应运而生。

通过对市面上的几款外呼平台调研,发现有很多业务场景并不支持,不仅可扩展性差、而且维护成本高,所以为了更好地承接主机厂业务,满足客户定制化需求,决定研发自己的智能外呼平台。

常见的外呼平台都是基于VoIP(Voice over Internet Protocol,缩写为VoIP)实现的,VoIP是基于IP的语音传输,是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议。

VoIP电话

不同于传统的电话,VoIP是一种新兴的电话通信方式。它是一种把语音技术集成在IP协议中,通过互联网进行传输的一种全新的通信方式,其成本远低于传统电话。

  • VoIP电话优点

图片


  • VoIP平台的选择

目前国内比较流行和拥有大量活跃用户的是Freeswitch(https://freeswitch.org/)和 Asterisk(http://www.asterisk.org/)

      下图为二者的简单对比:

      图片

结论:基于以上调研和对比,发现Freeswitch的资料相对完备,学习成本低,并且已有较多的成功案例,很多外呼供应商都采用Freeswitch作为软交换平台。因此,Freeswitch也 将是我们更优的选择。

初识Freeswitch

Freeswitch是一个开源的电话交换平台。官方给它的定义是——世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。在Freeswitch出现之前,软交换技术基本上掌握在少数通信企业,集成在硬件设备上整机出售,价格昂贵。需要大量的专业积累才能入门,使用者基本上偏运维,无法掌握实质的技术。

当Freeswitch以BypassMedia(旁路模式:此模式下freeswitch更像是一个信令proxy,媒体不会通过freeswitch,sdp消息体不做修改,没有录音,二次拨号等功能)运作时,它和其它VoIP通信原理一致,同样是点到点的实时通信。负责通话双方的媒体协商,交换RTP端口,编解码等信息,详细的SIP协议或协商流程可参见:RFC3261文档,源码及编译安装可以参见Freeswitch官网。

图片

  • Freeswitch运行机制

Freeswitch内部使用线程模型来处理并发请求,每个连接都在单独的线程中进行处理,不同的线程间通过Mutex互斥访问共享资源,并通过消息和异步事件等方式进行通信。这种架构能处理很高的并发, 并且在多核环境中运算能均匀地分布到多颗CPU或单CPU的多个核心上。Freeswitch的核心非常短小精悍,这也是其保持稳定的关键。绝大部分应用层的功能都在外围的模块中实现。外围模块是可以动态加载(以及卸载)的,在实际应用中可以只加载用到的模块。外围模块通过核心提供的Public API与核心进行通信,而核心则通过回调(或称钩子)机制执行外围模块中的代码。

图片

  • 开发模式的选择

Freeswitch的开发模式有两种:

  1. 面向服务器开发,这种开发模式是基于脚本内嵌的方式,主要开发lua脚本或者使用C语言开发mod,开发人员的学习成本高,不易维护,脚本之间无法复用;
  2. 面向客户端开发,Freeswitch支持多种语言,开发人员可以使用自己熟悉的开发语言(java)。通过调用核心API的方式,可以控制整个会话流程。

综上所述:虽然lua脚本或C语言的执行效率更高,但是客户端的开发模式更加方便定制化开发,易于开发,况且把复杂的业务逻辑放在Freeswitch服务端不利于后续的维护和扩展。面向客户端开发有2种连接模式:内连(Inbound)模式和外连(Outbound)模式。这里我们仅说下内连模式

图片

在内连模式下,Freeswitch作为一个服务器,而用户的程序可以作为一个TCP Client主动连接到Freeswitch上。同样,Freeswitch允许多个客户端连接。每个客户端连接上来以后,可以订阅Freeswitch的内部事件,实现可定制化开发。

例如:电话转接、定制化彩铃等都可以通过内联模式实现控制。

  • Freeswitch下基于sip协议的呼叫流程

图片

下面给出了上述调用流程的逐步解释

  • 发送到代理服务器的INVITE请求负责启动会话。
  • 代理服务器立即向呼叫者(Alice)发送 100 Trying 响应以停止INVITE请求的重传。
  • 代理服务器在位置服务器中搜索Bob的地址。在获得地址之后,它进一步转发INVITE请求。
  • 此后,由Bob产生的 180响铃(临时响应)被返回给Alice。
  • Bob在接听电话后立即生成 200 OK 响应。Alice收到 200 OK 时,Bob会收到来自Alice的 ACK 。
  • 同时,会话建立并且RTP分组(对话)开始从两端流动。
  • 在对话之后,任何参与者(Alice或Bob)可以发送 BYE 请求以终止会话。BYE 直接从Alice到Bob绕过代理服务器。
  • 最后,Bob发送 200 OK 响应以确认BYE并且会话终止。
  • 在上述基本呼叫流程中,三个事务(标记为1,2,3)可用。
    完整的呼叫(从INVITE到200 OK)称为 Dialog 。
  • Freeswitch主要配置文件

Freeswitch的核心底层代码是由C语言编写,如果需要重构Freeswitch核心功能、基于Freeswitch二次开发软交换,或者针对Freeswitch开发其他自定义模块,则需要在符合Freeswitch开发规范的情况下进行改造。而使用Freeswitch或者针对Freeswitch做esl应用端开发,则基本不需要更改Freeswitch底层代码逻辑,Freeswitch是通过提供基于静态xml的文件配置方式,来实现对Freeswitch所有功能的配置和调度控制。

图片

拨号计划(dialplan)是Freeswitch配置文件中至关重要的一部分,它的主要作用就是对电话进行路由。就是当一个用户拨号时,对用户所拨的号码进行分析,进而决定下一步该做       什么。如:可以拨打9197进行接通音乐校验,拨打1001不在线进入语音信箱留言等,通过拨号计划可以达到领编码进行功能的扩展。

由于Freeswitch知识点较多,每一个知识点展开讨论都比较大,以上篇幅仅把Freeswitch使用过程中的主要知识点做了介绍。接下来讲解下Freeswitch服务中心的演化构建。

Freeswitch 服务中心的演变

  • 单Freeswitch服务(1.0)
    在智能外呼服务从0到1的孵化过程中,如何保证各个功能点正确实现,业务顺利推进是首先需要解决的核心问题。一个简单的Freeswitch单体架构,是可以满足智能机器人的外呼通话要求。

图片

外呼机器人拨打流程:

  1. Freeswitch服务启动成功;
  2. 建立私有分机号,作为机器人账号;
  3. 机器人通过拨号规则调用Freeswitch;
  4. Freeswitch接收到拨号后调用配置的网关,把要呼叫的号码经防火墙后,发送给线路运营商;
  5. 线路商收到呼叫请求后,连接用户手机号,最终建立外呼机器人到用户手机的通信通道。

单体架构问题:

    1. 存在单点故障风险,从而会导致整个外呼系统瘫痪;2. 并发能力有限。
  • 负载均衡(2.0)

随着业务的的增长,外呼量会越来越大,对服务的稳定性要求也越来越高,对Freeswitch的高可用集群的诉求也被提上日程。

Freeswitch的高可用部署方式有两种:主备切换和负载均衡,官方文档介绍的主备切换部署是采用Corosync & Pacemaker,负载均衡采用前置opensips。

为了解决1.0 版本所面临的性能不足和单点故障风险,引入opensips前置于Freeswitch服务作为信令负载。

图片

 Freeswitch负载均衡架构图如上图所示,使用opensips服务作为负载控制端。

 工作流程:

  1. 外呼请求通过opensips服务动态分配可用的Freeswitch服务;
  2. Freeswitch接入mysql数据库,存储双边通道信息,共用同一份Session数据,保持通话;
  3. 客户端与Freeswitch服务直接建立连接;
  4. 外呼服务接收到转人工请求,直接通过ESL调用App命令进行拨号路由转接。

        当我们的服务中心需要提供给众多的主机厂业务一起使用时候,需要万级甚至十万级同时并发通话时,上述方式很难支持。

        新的的问题紧随而至:1.  每新增一台服务器都需要和线路商对接,增加了对接的难度;2.  每新增一台服务器,保持端口一致的情况下,需要占用一个公网ip地址。

  • 汇接局模式+负载均衡(3.0)
    上述2.0方案中,随着外呼业务量的增多,并发量的增大,相应需要部署的Freeswitch服务也会越来越多,从而导致公网ip使用成本上升。为了解决上述问题,进一步提升并发量,引入汇接局+负载均衡的模式。

图片

核心节点:

  • fs-router 路由中心
  • fs-media 媒体交换中心

fs-router路由中心主要有2个功能点,其一是:拨号寻址,线路对接。其二是:会话中间消息路由的转发。

fs-media媒体交换中心主要作为媒体(通话语音)传递,以及ESL通过Api和命令的方式对fs-media的调用。工作流程:

  1. 外呼请求通过opensips服务动态分配可用的freeswitch服务;
  2. fs-media接入mysql数据库,存储双边通道信息,共用同一份Session数据,以便保持通话;
  3. fs-mediaA/B(媒体终结服务) 经拨号路由转发给fs-router,由fs-router和线路商进行sip信令的交互;
  4. 通信建立成功后由fs-mediaA/B直接和线路商进行语音流传递;
  5. 客户端通过fs-mediaA/B和用户进行通话。

汇接局+负载均衡模式的优势:

  1. 汇接局模式,解决公网ip的占用问题;
  2. 统一出局,简化线路商对接;
  3. 方便扩展,简化新增服务配置;
  4. 由于集群式的部署,可以通过拨号方式的配置,针对不同的租户,分配到不同的fs-media上,做到租户之间的物理隔离。

总结

从第一次语音传输在1876年使用振铃电路实现,到现在通过网络来实现的新型电话通信,历经了100多年,每一次通信的革新都离不开科技的进步。VoIP网络电话的兴起,不仅预示着通信方式的革新,而且标志着新一代呼叫中心成为了电话通信的宠儿。随着Freeswitch服务中心的持续建设,通信业务层面的价值会逐步提升,打破了交换技术掌握在少数通信企业的壁垒,降低了接入难度和使用成本。从1.0的单一服务到3.0的汇接局+负载均衡,在架构升级后,Freeswitch服务中心不仅满足高并发,多租户的业务场景,而且还保证了服务的高可用、简化了对接流程、方便了服务的扩展。

  • 展望

新一代的呼叫中心更多地融入了媒体渠道与通信渠道。未来,在业务层面,Freeswitch服务中心不仅适应于智能外呼平台,同时可满足其他业务场景的使用。如:人机协同、在线客服、多人会议、视频通话、排队等待来电呼入等诸多场景。在技术层面,不仅要考虑性能和可用性的提升,而且还要兼顾其通话、视频等质量的提高。通过多fs-router(路由中心),进一步提高它的性能和可用性。最后,追随技术的脚步,迎接新的挑战。

文章参考:

  1. SIP 教程:https://www.w3cschool.cn/session_initiation_protocol/
  2. Freeswitch权威指南
责任编辑:庞桂玉 来源: 之家技术
相关推荐

2010-08-06 10:16:55

RIP协议Linux

2018-04-19 10:39:45

大数据资源控制大数据平台

2010-05-14 14:07:38

VMwareXen

2011-09-05 15:09:06

Android平台Phonegap

2010-05-20 13:30:26

MySQL代码

2009-06-22 15:39:45

JSFGlassFish管理

2010-10-09 15:40:19

CookieJ2ME

2014-05-09 15:43:39

移动安全Android安全

2018-06-29 10:08:55

AI、人工智能、云讯、

2009-11-25 08:52:07

Web应用IE应用

2017-11-28 08:47:19

TensorFlow区块链大数据分析

2010-05-04 13:41:04

Unix平台

2010-07-05 16:25:13

IPX SPX协议

2023-10-16 18:51:04

ClickHouse大数据

2010-07-22 08:42:04

Eclipse平台中P

2020-03-22 15:49:27

Kafka马蜂窝大数据平台

2020-01-03 09:53:36

Kafka集群优化

2022-06-20 06:19:25

深度学习5G拦截系统5G不良管控平台
点赞
收藏

51CTO技术栈公众号