Idapted的FreeSWITCH实践

注:与本文对应的英文版本发布在 http://wiki.freeswitch.org/wiki/FreeSWITCH_Testimonial_on_Idapted.com,但本文不是原英文版的翻译。

FreeSWITCH是如何创造数千个就业机会并改变人们命运的?

“改变命运”,说起来有点言过其实,但从某种意义上说,我们确实做到了。FreeSWITCH已成为我们业务逻辑中非常关键的一部分,在此,我们想与大家分享一下我们的一点使用经验,并希望能以此来感谢FreeSWITCH社区中所有帮助过我们的人。

我们到底做了什么?不像其它公司,我们并不使用FreeSWITCH来经营电信业务,而是主要做技术和教育(http://www.eqenglish.com)。在我国,学生要到说英语的国家留学或工作,必须要通过相关的英语考试。但是,他们大都缺少真正的英语环境,很少能跟母语是英语的人交谈;即使有,也通常很昂贵。与此同时,在美国,却有很多人在寻找在家工作的机会。这些人通常具有良好的教育背景和很好的工作经验,通过我们的课程培训,他们就能成为很好的老师。是的,我们有自己的课程体系。比方说,雅思考试并不死抠语法,而是更注重学生是否能准确流利地用英语表达自己的思想。但目前很多教科书上还都是照本宣科,使很多学生得不到要领。而我们的老师都能启发学生做到些。不管你是否相信,我们的绝大部分学生都能通过一段时间的培训达到自己期望的分数,而在此之前,他们有的考了几年都未达到。当然,我们绝不是应试教育。就在几小时前,有一个学生还给我们的课程顾问打电话,喜极而泣。同时,对我们的老师而言,他们正在做着一项以前在美国业界还没有过的工作─http://www.idapted.com

FreeSWITCH到底是如何帮助我们的成功的呢?首先,它是我们整个语音系统的核心,担负着录音、电话路由、多协议连接、与WEB系统无缝集成等重要任务,这些都是我们成功的关键。更重要的是,要横跨太平洋连接中、美两国,考虑不同国家的网络环境,建立多个服务器,这都是很严峻的挑战。如果采用普通的商业软件解决方案的话实现起来会非常困难,甚至是不可能的,而FreeSWITCH作为一款开源软件,却能很好地做到了这一点。

在此之前,我们也曾使用过其它的VoIP平台,用的最多的是Asterisk。诚然,Asterisk也是一款很优秀的开源软件,但当时我们经常会遇到一些模块死锁,录音超长等问题,一直无法解决。特别是随着我们的业务逻辑日渐复杂、用户一多起来之后,它更显得有些力不从心。幸运的是,我们遇到了FreeSWITCH。我们用了一天的时间阅读FreeSWITCH的源代码(这正是我们喜欢开源软件的原因),当时几乎是拍案而起:“这不正是我们需要的吗?” 接下来,我们用了几天的时间熟悉和测试各个模块,并向FreeSWITCH开发者提了好多修改建议,同时也得到了他们和社区很多的帮助。我们从2008年4月正式开始使用FreeSWITCH。

我们很快实现了所有的业务逻辑。美国的老师通过我们自己编写的VoIP客户端连接到FreeSWITCH以及我们的WEB系统上,学生则可以根据上课进度连接老师进行一对一对话。说起来倒也简单,等学生预习完所有课程后,通过在WEB界面上输入一个手机号(或其它电话号码,甚至是Skype或gtalk用户名),我们的平台就会呼叫该号码,并选择最好的老师与之交谈。同时,老师和学生的电脑上都会同步显示当前课程的内容。

我们遇到最大的挑战是老师和学生分别在太平洋的两岸。曾经出现过几次亚、太之间的光缆中断事故,对我们的语音通信造成了很大的影响。后来,我们不得不通过在多个不同的数据中心架设多台冗余的服务器来减少单一路由对我们的影响。

另外,我们也在生产服务器上运行FreeSWITCH的多个实例。藉此我们可以在使用最新代码的同时又减少BUG的影响(说实在的,其实FreeSWITCH的BUG通常修的很快,也是极少数的trunk代码比上一个稳定发行版更稳定的工程之一)。我们的总体结构是通过一个“主”FreeSWITCH(FS)连接到其它FreeSWITCH实例上,专门负责skype的(FS-skype)就只加载skype模块mod_skypiax,专门负责Google Talk的(FS-gtalk)就只加载Gtalk模块mod_dingaling。FreeSWITCH允许我们通过设置不同的配置文件来运行同一个或多个版本的代码。因此我们设置了/usr/local/freeswitch, /usr/local/skype, /usr/local/gtalk等等的目录结构来存放不同的配置文件。更重要的一点是,如果某个FreeSWITCH实例崩溃了(如FS-skype。说实话,FS-skype现在已经很稳定,但我们最初使用时该模块刚处于 阶段,所以有时会崩溃),电话就会自动路由到其它的服务器,甚至可能到其它数据中心的服务器(我们在香港和大陆的几个数据中心里放了冗余的服务器,如图)。

我们使用了以下几个主要模块:

mod_sofia(SIP模块)

FreeSWITCH使用sofia-sip提供SIP支持。我们使用SIP连接老师,而通过SIP-PSTN网关呼叫学生。使用PSTN网络呼叫学生的好处是,学生可以直接输入一个手机号(或固定电话)接听电话,而不需要在电脑上进行任何配置。这就免去了我们帮助他们解决网络、麦克风、耳机等问题的麻烦(相当多的学生对设置这些东西不是很熟悉,所以要远程处理这些问题,工作量是很大的)。FreeSWITCH在路由选择方面很智能,所以我们在一个网关失败后很容易的选择其它的网关。而且,FreeSWITCH的NAT穿透力是非常棒的,它支持AutoNAT,可以在不需要STUN的情况下在NAT网络上工作。

mod_skypiax(Skype模块)

尽管手机易于使用,但有些学生是为了学业奔波于异地,由于漫游的原因无法用手机接听。而且我们也发现确实有许多学生喜欢带着耳机跟老师连线。正好FreeSWITCH有一个模块可以连接Skype。最初我们使用时,它极不稳定(这也是为什么我们启动多个FreeSWITCH实例的原因之一)。老实说,当时它确实给我们带来了很大的麻烦,但想想它仅仅是 阶段的代码,本来就有此风险。幸运的是,模块作者Giovanni Maruzzelli(意大利人)非常勤奋,他很快修复了许多BUG,甚至还抽出时间登录到我们服务器上帮助查找问题(我们欠他一个大大的人情)。为了使该模块更有用,我们也写了许多patch,如使用ANY和RR接口进行顺序和循环选线以及一些BUG修复等。另外一些特性如continue-load-on-fail和auto-skype-user尚未合并到trunk代码中去。非常感谢FreeSWITCH社区给了我们一个可以奉献的平台。

mod_erlang_events(Erlang模块)

它是实现我们新的业务逻辑的另一个关键模块。我们有非常复杂的实时队列以及路由系统,以及很多相关的WEB页面和TCP套接字(socket)。这些很难直接在FreeSWITCH中实现。而Erlang天生的多进程支持使它成为实现这些技术最适合工具。我们用Erlang开发了粘合FreeSWITCH与前端Ruby on Rails应用的中间件,通过HTTP和共享数据库与前端通信,而在后端,则通过mod_erlang_events与FreeSWITCH集成。每当有一个学生与老师连线时,我们都创建一个新的Erlang进程,所有的消息与状态机均在该进程内部完成,而不影响其它进程。同时,它还根据收到的FreeSWITCH事件(event),通过实时推送技术(comet socket)同步更新学生和老师端的WEB界面。

mod_conference(会议模块)

我们使用mod_conference召开老师的电话会议。我们的老师分布在美国的各个州,而我们的总部在北京。通过网络电话会议,我们不仅可以节省通信成本,更重要的是我们可以方便的进行会议录音,播放声音文件,记录会议出席情况等,也便于及时有效地对老师进行培训。

mod_fifo(队列模块)

另外,我们还把它用作办公室PBX(提供中英双语的语音菜单)以及呼叫中心(销售)和客服系统。mod_fifo本是个很简单的模块,我们提交了一些Patch,使得它能完成相对复杂的呼叫队列功能。销售及客服系统均与我们自己编写的CRM系统(客户关系管理系统)紧密集成,大大提高了我们销售的业绩和客户服务水平。

FreeSWTICH非常强大和稳定,我们只是使用了其功能的一小部分。当然,除了其强大的功能外,更重要的是它的开放性及社区支持。首先,它是开源的,当遇到问题时我们很容易地查看源代码找到问题所在。其次,它的社区是活跃地、友好地,如果我们提交一个BUG,一经确认通常在一天之内就修复了(如果不是时差的关系可能会更快)。再次,我们可以提交自己的补丁程序或添加新功能,只要是有用的,他们都很乐于接受。值得一提的是,Anthony Minessale及其核心团队帮助我们实现了完整的SIP支持。回到1.0.0时代,Anthony曾在mod_sofia上做了大量工作,最终使得SIP客户端可以在不需要STUN的情况下在NAT网络上工作。这一点的重要性并不在于他做了多少改变,而是他帮助我们确确实实实现了一个有竞争力的系统,同时我们认为这一特性对FreeSWITCH也相当重要。

总的来说,FreeSWITCH给我们带来了新的技术并成就了新的商业模型。而强大的社区支持又让它能做的更好。我们每天都很兴奋地在它上面工作,以推动这项技术向更深更广的方向发展。同时我们非常确信这是未来最理想的电话平台。

七歌
微信扫一扫