

Freeswitch集群在智能外呼平台中的应用
source link: https://www.51cto.com/article/718038.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

两年来,新冠疫情给我们的工作生活带来了巨大影响,社会各界都面临着严峻的挑战。汽车之家敏锐的洞察到降低人力成本,筛选高优客户、提高意向成交率已经成为各主机厂的迫切需求,因此,智能外呼平台,应运而生。
通过对市面上的几款外呼平台调研,发现有很多业务场景并不支持,不仅可扩展性差、而且维护成本高,所以为了更好地承接主机厂业务,满足客户定制化需求,决定研发自己的智能外呼平台。
常见的外呼平台都是基于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的开发模式有两种:
- 面向服务器开发,这种开发模式是基于脚本内嵌的方式,主要开发lua脚本或者使用C语言开发mod,开发人员的学习成本高,不易维护,脚本之间无法复用;
- 面向客户端开发,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单体架构,是可以满足智能机器人的外呼通话要求。

外呼机器人拨打流程:
- Freeswitch服务启动成功;
- 建立私有分机号,作为机器人账号;
- 机器人通过拨号规则调用Freeswitch;
- Freeswitch接收到拨号后调用配置的网关,把要呼叫的号码经防火墙后,发送给线路运营商;
- 线路商收到呼叫请求后,连接用户手机号,最终建立外呼机器人到用户手机的通信通道。
单体架构问题:
- 1. 存在单点故障风险,从而会导致整个外呼系统瘫痪;2. 并发能力有限。
- 负载均衡(2.0)
随着业务的的增长,外呼量会越来越大,对服务的稳定性要求也越来越高,对Freeswitch的高可用集群的诉求也被提上日程。
Freeswitch的高可用部署方式有两种:主备切换和负载均衡,官方文档介绍的主备切换部署是采用Corosync & Pacemaker,负载均衡采用前置opensips。
为了解决1.0 版本所面临的性能不足和单点故障风险,引入opensips前置于Freeswitch服务作为信令负载。

Freeswitch负载均衡架构图如上图所示,使用opensips服务作为负载控制端。
工作流程:
- 外呼请求通过opensips服务动态分配可用的Freeswitch服务;
- Freeswitch接入mysql数据库,存储双边通道信息,共用同一份Session数据,保持通话;
- 客户端与Freeswitch服务直接建立连接;
- 外呼服务接收到转人工请求,直接通过ESL调用App命令进行拨号路由转接。
当我们的服务中心需要提供给众多的主机厂业务一起使用时候,需要万级甚至十万级同时并发通话时,上述方式很难支持。
新的的问题紧随而至:1. 每新增一台服务器都需要和线路商对接,增加了对接的难度;2. 每新增一台服务器,保持端口一致的情况下,需要占用一个公网ip地址。
- 汇接局模式+负载均衡(3.0)
上述2.0方案中,随着外呼业务量的增多,并发量的增大,相应需要部署的Freeswitch服务也会越来越多,从而导致公网ip使用成本上升。为了解决上述问题,进一步提升并发量,引入汇接局+负载均衡的模式。

核心节点:
- fs-router 路由中心
- fs-media 媒体交换中心
fs-router路由中心主要有2个功能点,其一是:拨号寻址,线路对接。其二是:会话中间消息路由的转发。
fs-media媒体交换中心主要作为媒体(通话语音)传递,以及ESL通过Api和命令的方式对fs-media的调用。工作流程:
- 外呼请求通过opensips服务动态分配可用的freeswitch服务;
- fs-media接入mysql数据库,存储双边通道信息,共用同一份Session数据,以便保持通话;
- fs-mediaA/B(媒体终结服务) 经拨号路由转发给fs-router,由fs-router和线路商进行sip信令的交互;
- 通信建立成功后由fs-mediaA/B直接和线路商进行语音流传递;
- 客户端通过fs-mediaA/B和用户进行通话。
汇接局+负载均衡模式的优势:
- 汇接局模式,解决公网ip的占用问题;
- 统一出局,简化线路商对接;
- 方便扩展,简化新增服务配置;
- 由于集群式的部署,可以通过拨号方式的配置,针对不同的租户,分配到不同的fs-media上,做到租户之间的物理隔离。
从第一次语音传输在1876年使用振铃电路实现,到现在通过网络来实现的新型电话通信,历经了100多年,每一次通信的革新都离不开科技的进步。VoIP网络电话的兴起,不仅预示着通信方式的革新,而且标志着新一代呼叫中心成为了电话通信的宠儿。随着Freeswitch服务中心的持续建设,通信业务层面的价值会逐步提升,打破了交换技术掌握在少数通信企业的壁垒,降低了接入难度和使用成本。从1.0的单一服务到3.0的汇接局+负载均衡,在架构升级后,Freeswitch服务中心不仅满足高并发,多租户的业务场景,而且还保证了服务的高可用、简化了对接流程、方便了服务的扩展。
- 展望
新一代的呼叫中心更多地融入了媒体渠道与通信渠道。未来,在业务层面,Freeswitch服务中心不仅适应于智能外呼平台,同时可满足其他业务场景的使用。如:人机协同、在线客服、多人会议、视频通话、排队等待来电呼入等诸多场景。在技术层面,不仅要考虑性能和可用性的提升,而且还要兼顾其通话、视频等质量的提高。通过多fs-router(路由中心),进一步提高它的性能和可用性。最后,追随技术的脚步,迎接新的挑战。
文章参考:
- SIP 教程:https://www.w3cschool.cn/session_initiation_protocol/
- Freeswitch权威指南
Recommend
-
127
iPhone8Plus前面板撑爆的事件仍在继续发酵。国庆期间,英国《卫报》报道称,苹果正在着手调查发生于日本、台湾、香港、希腊、加拿大的五起案例。随后,一台据称来自京东渠道的国行也中招。据Poketnow援引台湾媒体的报道称,10月3日在台中,又一台iPhone8Plus裂屏的...
-
3
如何通过AI外呼提高私域加粉率? 发布者: 91运营 ...
-
11
巧用链卡AI外呼3大引流路径!企微加粉通过率翻倍-鸟哥笔记 首页 >...
-
2
抖音双11好物节收官,火山引擎智能外呼助力抖店商家实现业绩增长-品玩 业界动态 抖音双11好物节收官,火山引擎智能外呼助力抖店商家实现业绩...
-
4
和ChatGPT同源技术的及猫云AI外呼,是如何打成功一通电话的?-品玩 业界动态 和ChatGPT同源技术的及猫云AI外呼,是如何打成功一通电话的?
-
6
外呼系统,有哪几种外呼形式? 通信产品的那些事 2023-04-24 0 评论...
-
3
作为普通的用户,我们在接到疑似客服或者销售电话时都会毫不犹豫地挂掉。但作为产品经理,我们要想办法减少这种情况,提高外呼系统的接通率。应该怎么做呢?本文作者对此发表了自己的看法,与你分享。
-
4
外呼不通?如何排查 通信产品的那些事 2023-06-05 0 评论...
-
4
外呼系统选型的5个坑点 通信产品的那些事 2023-07-27 0 评论...
-
2
有些时候,企业可能会需要通过语音外呼来实现对用户的强制性触达,那么,怎么做好外呼的全流程设计?在这篇文章里,作者针对一个AI外呼项目,从外呼目标、人群圈选等维度进行了复盘总结,一起来看一下。
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK