Agispeedy

Agispeedy是包含在Freeiris项目中的一个部分. ENGLISH

描述

Agispeedy是被设计用来替代Asterisk AGI用法的. 它比普通AGI模式快1000%,并且拥有更强的扩展性和稳定性.

Agispeedy特点:

  • 通过TCP Sockets实现AGI(FastAGI).
  • 使用纯Perl编写,基于稳定的Perfork模式架构.
  • 比单纯使用FastAGI更容易维护(可动态读取流程模块且无需重启Agispeedy服务)
  • 远程执行AGI服务的能力(构架于FastAGI)
  • 快速的数据交互能力(你可以在子线程中对数据库进行长连接以便在需要的时候直接使用)

以下表格为Asterisk扩展技术对比:

名称 速度 稳定 集群
asterisk模块 最快 不能
agi 不能
fastagi 很快 中等 可以
agispeedy 很快 很高 可以

概要

/agispeedy/bin/agispeedy --verbose
[Fri May 21 19:24:15 2010] Agispeedy 2.0 services on...
[Fri May 21 19:24:15 2010] Loading static : demo_static
[Fri May 21 19:24:15 2010] 2010/05/21-19:24:15 main (type Net::Server::PreFork) starting! pid(32528)
[Fri May 21 19:24:15 2010] Binding to TCP port 4573 on host *
[Fri May 21 19:24:15 2010] Setting gid to "0 0"
[Fri May 21 19:24:15 2010] Setting up serialization via flock
[Fri May 21 19:24:15 2010] Beginning prefork (6 processes)
[Fri May 21 19:24:15 2010] Starting "6" children

指南

获取源码

你可以从SVN获取,linux下可以使用如下命令(请确定你的系统安装上了svn):
>svn export http://darwin.freeiris.org/svn/freeiris/addition/agispeedy/
Win下可以使用专门的svn客户端,具体操作请自行研究。
你也可以直接访问
>http://darwin.freeiris.org/svn/freeiris/addition/agispeedy/来查看源码

安装

进入到bin的目录后执行命令:

./install.pl

把contrib/agispeedy.init.centos拷贝到/etc/init.d/可实现agispeedy的开机启动

注意: 要以root用户执行

>cd agispeedy
>chmod +x install.pl
>./install.pl

  [RESPONSE] Agispeedy Installer
    [INPUT] continue to install agispeedy to /agispeedy (yes/no)?yes
......
  [RESPONSE] set /etc/agispeedy
  [RESPONSE] set agispeedy services

命令

更多的AGIspeedy参数:

  • -?, –help 显示当前帮助并退出.
  • -V, –version 显示当前版本信息并退出.
  • -v, –verbose 显示一些系统调试信息(第4个级别为debug).
  • -q, –quiet 启动Agispeedy以后台模式.
  • -c, –config=path 指定配置文件目录.
  • -L, –log=path 指定日志文件目录.
  • -l, –lib=lib 指定Agispeedy库目录.
  • -P, –pid=path 指定pid文件目录.
  • -a, –var=path 指定Agispeedy模块目录.

DEBUG模式

./agispeedy –verbose

这将输出agispeedy的服务信息

通常模式

./agispeedy –quiet

agispeedy将在后台运行并且把信息写入log_files.

运行服务

/etc/init.d/agispeedy start

如果你不是redhat系列的系统, 你可能需要手动安装初始脚本.

检查进程

>ps ax|grep agispeedy
32424 ?        Ss     0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32425 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32426 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32427 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32428 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32430 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy
32431 ?        S      0:00 /usr/bin/perl /agispeedy/bin/agispeedy -q -c /etc/agispeedy

快速演示

目录结构:

  • /agispeedy/ 根目录
  • /agispeedy/var 模块目录
  • /agispeedy/log 日志和pid文件
  • /agispeedy/lib 库文件目录,如果你想对agispeedy进行更多的控制,你可以看下这里的文件.
  • /agispeedy/etc 配置文件目录
  • /agispeedy/bin agispeedy主程序

1) 请先启动agispeedy服务.

编辑extensions.conf,在[default]下添加:

exten => 123456,1,NoOp('agispeedy demo')
exten => 123456,n,AGI(agi://127.0.0.1/demo_dynamic?number=7890)
exten => 123456,n,hangup

2) 如果你的agispeedy与asterisk不在同一台机器上,你需要修改”127.0.0.1”为你agispeedy服务所在的机器地址.

3) 拨打123456, 你会听到播放语音”7890”.

agispeedy.conf

编辑etc下的agispeedy.conf.

# 这只是个简单的配置示例
[general]
etc_path=/etc/agispeedy/
bin_path=/agispeedy/bin/
pid_path=/agispeedy/log/
lib_path=/agispeedy/lib/
log_path=/agispeedy/log/
var_path=/agispeedy/var/

# 运行初始化时需要的
[services]
# * 的意思是绑定当前主机上所有可用的IP
host=*
# 4573是asterisk fastagi默认端口
port=4573
# 执行agispeedy的权限组和用户
user=
group=
# 如果你有强劲的cpu和足够多的内存你可以尝试修改下面的配置来获取更好的性能
min_servers=6
min_spare_servers=2
max_spare_servers=12
max_servers=64
max_requests=512

[log]
# 是否记录系统日志yes/no,默认是开启
enable=yes
# 设置日志等级,默认是 2 :
# 0 错误,1 警告,2 通知,3 信息,4 debug
level=2

[agispeedymodules]
enable_dynamic=yes
# 开启静态模块预加载功能
enable_static=yes
# 动态模块后缀名
dynamic_ext=dam
# 静态模块后缀名
static_ext=sam

编写agispeedy的模块

Agispeedy可以自动加载用户所请求的模块.

模块格式

  • 这里有2点需要注意:
    • 静态模块- 保存在 /agispeedy/var/ 并且后缀名为”.sam”
      • 此类型的模块将在agispeedy服务启动时就加载,一旦加载如果模块内容变更需要重启agispeedy
    • 动态模块- 保存在 /agispeedy/var 并且后缀名为”.dam”
      • 该模块只在需要的时候才会加载,并且模块内容变更也不需要重启agispeedy,真正做到即写即用.

agispeedy工作原理

例如: 
exten => 123456,n,AGI(agi://127.0.0.1/demo_dynamic?number=7890)
  • asterisk发送socket请求到agispeedy执行脚本demo_dynamic并传递参数。
  • agispeedy分配一个子进程来响应asterisk的请求
  • 子进程查找内存中是否有加载名为demo_dynami的静态模块
  • 如果没有就在/agispeedy/var/下查找是否有demo_dynamic.dam的动态模块,如果找到则
  • 解析参数并保持在系统变量中
  • 对demo_dynamic.dam进行语法检查并加载
  • 执行入口函数demo_dynamic()并返回结果给asterisk
  • 子进程退出

如果你需要新的功能可以编写相应模块后放在/agispeedy/var

编写新模块

注意:你的模块名和你的入口方法名必须是一样的,例如

abc.sam的入口方法名称必须是sub abc()

def.dam的入口方法名称必须是sub def()

demo_dynamic.dam:
# write by somebody
use foo;  #你可以继续加载你需要的模块
sub demo
{
my $self = shift;
my $server_prop = $self->{server};
my $agi = $server_prop->{agi};
my $params = $agi->{params};

my $number = $self->_demo_count($params->{'number'});
    $agi->say_digits($number);

exit;
}
sub _demo_count
{
  return($_[0]);
}
  • $server_prop是你可以用到的所有系统信息的hash引用集,包括AGI句柄和数据库句柄都可以在这里获取
  • $agi继承了Asterisk::AGI的所有方法Asterisk::AGI
  • $params是从asterisk获取的参数的hash引用

Agispeedy 规则

  • 每个模块的名称是唯一的.
  • 变量作用域范围只对当前子进程中的模块有效.
  • $self是一个hash引用来自于agispeedy的子进程.
  • %OPT, %STATIC_MODULES, @STATIC_MODULES_LIST是所有子进程公用的全局变量.

FAQ

高负载的Mysql连接

Agispeedy支持hooks,你可以在每个子进程启动时先进行mysql的连接以便后面使用,这样可以减少程序执行时因等待数据库连接而造成时间等待.

编辑/agispeedy/lib/agispeedy_hook.pm
sub child_init_hook()
{
     #你可以在这里加入数据库连接
     #并且把该句柄注册到$self->{server}{dbh}
     #这样你就可以在你的模块中直接使用该句柄了
}

在/agispeedy/var/demo.dam里
sub demo
{
my $self = shift;
my $dbh = $self->{server}{dbh};
}

示例

Freeiris2 中国开源通讯使用Agispeedy替代所有的AGI应用

作者

版权

Copyright © 2009, Sun bing hoowa.sun@gmail.com. Copyright © 2010, Fonoirs CO.,LTD.

基于GNU General Public License VERSION 2发布.

注意

Agispeedy是一个开源并且免费的软件.

由使用Agispeedy而造成的任何问题和损失与开发者无关.

支持

Asterisk/Trixbox/Freeiris2调试安装服务

提供Freeiris2 / Asterisk / Trixbox / Elastix 调试安装服务
厂商: 北京开源方诺科技有限公司  编号:   质保: 0月  查看详细
 此产品为第三方赞助商向您推荐.
Freeiris爱好者QQ群  43185599
agispeedy_cn.txt · Last modified: 2010/06/30 16:00 by nsnake
Copyright © 2010 Freeiris DevelopTeam All Rights Reserved