如何提升Asterisk 执行脚本的性能
我们在做Asterisk功能开发的时候,除了直接用C写模块之前,更常用的方法是用自己熟悉的语言来开发自己的业务逻辑,这个时候就需要用到AGI的功能。一般比较多的选择是:PHP,Perl,JAVA 来实现。JAVA因为是FASTAGI的方式,故效果会比PHP,Perl好点,因为PHP,Perl是脚本语音,需要进行编译操作,故这个CPU消耗还是比较大的。 另外一种方式是asterisk 的dialplan 是可以直接支持lua 脚本来编写,这个就很方便来用lua 来做扩展。经过实测使用Lua方式来做嵌入式来扩展业务,这个性能确实有质的飞跃。 故本次将介绍使用Lua来写dialPlan。 官方文档指引,请参考: https://wiki.asterisk.org/wiki/display/AST/Lua+Dialplan+Configuration 通过官方文档的介绍,其实extensions.lua 其实就是一个lua 脚本,直接在上面写代码即可。 关于数据存储的选择技巧: 如果要快速响应呼叫请求,可以利用redis 来做缓存,使用redis 的列表功能进行消息推送。把话单和通话状态通过外部的监控服务来推送到MySQL。 经过上面的改造后,Asterisk的性能得到了很大的提升,下面是具体的测试效果: CPU型号: Intel(R) Core(TM) i3-4020Y CPU @ 1.50GHz CPU个数:4 内存:4G Asterisk版本:Asterisk 13.21.0 上面安装了2套Asterisk,一套做接入转码,一套做模拟正常的30%的接通率。 稳定并发:150线并发 一台微型小机器,即可满足大部分公司的业务需求。 下面附上lua dialplan 的使用例子:
function hangup() app.Hangup() end function verbose(msg) app.Verbose('"' .. msg .. '"') end function noop(msg) app.Noop('"' .. msg .. '"') end function dial(dialstr) app.Dial(dialstr) end function getChannelItem(item) return channel.CHANNEL('"' .. item .. '"'):get() end function getCallerIdItem(item) return channel.CALLERID('"' .. item .. '"'):get() end function getVar(key) -- key : CALLERID(num) ,EXTEN , CHANNEL return channel[key]:get(); end function setVar(key,val) channel[key] = val; end e = {}; e.default = {}; e.default["_X."] = function(context,exten) app.Noop("incoming call to default") app.Hangup() end; e.TO_EXT_UserName = {}; e.TO_EXT_UserName["_X."] = function(context,exten) local peerIp = channel.CHANNEL('peerip'):get() local userAgent = channel.CHANNEL('useragent'):get() local uriHeader = channel.CHANNEL('ruri'):get() local from = channel.CHANNEL('from'):get() local concat = getChannelItem('uri') local caller = getCallerIdItem('num'); local callerName = getCallerIdItem('name') local uniqueid = getVar('UNIQUEID'); local channelName = getVar('CHANNEL'); setVar('CALLERID(num)','+8615875329063') local msg = 'incoming call: ' .. peerIp .. ',useragent: '.. userAgent .. ',request uri: ' .. uriHeader ..',from header: ' .. from .. ',concat header: ' .. concat ; verbose(msg); msg = "caller: " .. caller ..",callerName: " .. callerName ..',uniqueid: ' .. uniqueid .. ',channel name: ' .. channelName; noop(msg); caller = getVar('CALLERID(num)'); noop("Your new callerid is: " .. caller) local res = dial("SIP/IMS_PROXY/" .. exten .. ',45,geU(sub_record_ims^s)') hangup() end; e.TO_EXT_UserName["h"] = function(context,exten) local msg = ''; local caller = getCallerIdItem('num'); local callerName = getCallerIdItem('name') local uniqueid = getVar('UNIQUEID'); local duration = getVar('DIALEDTIME'); if duration == nil or duration == '' then duration = 0; end local billsec = getVar('ANSWEREDTIME'); if billsec == nil or billsec == '' then billsec = 0; end local dialresult = getVar('DIALSTATUS'); if dialresult == nil then dialresult = '' end -- 获取挂断通道名称 local hangupCauseString = getVar('HANGUPCAUSE_KEYS()'); msg = "hangup==> caller: " .. caller .. ',is hangup,uniqueid='.. uniqueid .. ',duration='.. duration .. ',billsec='.. billsec .. ',result: ' .. dialresult; noop(msg) -- 获取挂断原因SIP代码 local hangupCause = getVar('HANGUPCAUSE("' .. hangupCauseString ..'",tech)'); msg = "hangup by: " .. hangupCauseString .. ',hangupCause: ' .. hangupCause; noop(msg) end; e.sub_record_ims = {}; e.sub_record_ims['s'] = function(context,exten) -- 当被叫接通主叫前执行 local msg = ""; local caller = getCallerIdItem('num'); local callerName = getCallerIdItem('name') local uniqueId = getVar('UNIQUEID'); msg = "caller: " .. caller .. ',callerName: ' .. callerName .. ',uniqueId: ' .. uniqueId .. ' is answered ...'; noop(msg); app['Return'](); end extensions = e;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
国产UOS系统与奇安信浏览器适配:支持国密、1080p在线视频
今天统信软件宣布UOS系统与奇安信旗下的安全浏览器完成了产品认证,支持国家加密标准,也能胜任1080p视频在线播放等复杂场景。 奇安信集团是专为政企机构和组织提供企业级网络安全技术、产品和服务的网络安全公司。相关产品和服务已覆盖到中央政府部门、中央企业和大型银行等单位,已在印度尼西亚、新加坡、加拿大、中国香港等国家和地区开展了网络安全业务。 奇安信浏览器是奇安信专为支撑政企应用的一款跨平台的,具备卓越稳定性和广泛兼容性的浏览器产品,该浏览器全面支持龙芯、鲲鹏、兆芯、飞腾、海光等CPU平台。 奇安信浏览器是以W3C标准为基础的、专为政企打造的安全浏览器产品。 1、支持WebGL、GPU加速、WebAssembly等国际先进技术,支持流畅的大屏动态数据展示、播放1080P在线视频等复杂场景。同时兼容NPAPI插件技术,全面支持Flash、电子公文、流版签章应用。 2、支持国密通信,可以满足政企用户对统一管控、日志审计、内网应用文件杀毒等政企常见安全上网、管控需求。 3、可以满足政企单位互联网安全、稳定、快捷的接入需求,为政企上网提供首选解决方案。 在此之前,UOS系统已经适配了国内多个应用...
- 下一篇
实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离
实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离 前言 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件。结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群。 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容。 一、集群搭建结构及拓扑 1.1集群架构图示 Nginx+Tomcat集群的结构示意图如下: 1.2系统环境与地址规划 使用三台Centos7服务器(7.4),规划如下: 服务器 网卡模式 IP地址 Nginx NAT 20.0.0.128 Tomcat1 NAT 20.0.0.130 Tomcat2 NAT 20.0.0.136 1.3拓扑图如下 1.4相关资源软件 链接:https://pan.baidu.com/s/1Qdla-vrpcspcAKJucZdSUg 提取码:40it 二、搭建思路及核心部分配置 根据上述的结构图示,为了完成该实践内容,需要先梳理搭建的思路,搞清楚核心部分的操作与配...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案