3

我正在使用 Perl 编写多个 AGI,这些 AGI 将从 Asterisk 拨号方案中调用。我希望收到大量的同时呼叫,因此我需要一种方法来对它们进行负载平衡。有人建议我使用 FastAGI 而不是 AGI。问题是我的 AGI 将分布在许多服务器上,而不仅仅是一个,我需要我的入口点 Asterisk 根据它们的可用性在这些服务器(agis 所在的位置)之间分派调用。所以,我想为 FastAGI 应用程序提供多个 IP 地址而不是一个。可能吗?

4

3 回答 3

2

任何 TCP 反向代理都可以解决问题。HAProxy是一个,而带有TCP 模块的nginx是另一个。

不久前,我使用 node.js ( nodast ) 制作了自己的 FastAGI 代理来解决这个非常具体的问题,包括通过 SSL 运行 FastAGI 协议和基于 AGI 请求位置和参数路由请求的能力(例如 $dnis、$channel、$language、...)

此外,由于代理配置基本上是 javascript,因此您实际上可以以非常有趣的方式进行负载平衡。

示例配置如下所示:

var config = {
    listen : 9090,
    upstreams : {
        test : 'localhost:4573',
        foobar : 'foobar.com:4573'
    },
    routes : {
        'agi://(.*):([0-9]*)/(.*)' : function() {
            if (this.$callerid === 'unknown') {
                return ('agi://foobar/script/' + this.$3);
            } else {
                return ('agi://foobar/script/' + this.$3 + '?callerid' + this.$callerid);
            }
        },
        '.*' : function() {
            return ('agi://test/');
        },
        'agi://192.168.129.170:9090/' : 'agi://test/'
    }
};
exports.config = config; 
于 2012-06-14T21:31:49.100 回答
1

Mehhh ...使用适用于负载平衡的相同结构,例如网页请求。

一种方法是在 DNS 中循环。因此,如果您有 vru1.example.com 10.0.1.100 和 vru2.example.com 10.0.1.101 您在 DNS 中放置两个条目,例如...

fastagi.example.com 10.0.1.100

fastagi.example.com 10.0.1.101

...然后从拨号计划 agi(agi://fastagi.example.com/youagi) 理论上应该在 10.0.1.100 和 10.0.1.101 之间交替。您可以根据需要添加任意数量的主机。

另一种方法是在这里解释一些有点太复杂的东西,但是像 HAProxy 这样的代理工具应该能够在多个服务器之间路由,并且能够从混合中“取出一个”进行维护或更高级平衡,如根据当前负载平均分配。

于 2010-06-26T17:42:54.273 回答
1

我有一个使用 FastAGI 的大型 IVR 实现(24 个 E1 都在进行 FastAGI 调用,峰值约为 80%,因此有近 600 个 Asterisk 通道调用 FastAGI)。我没有找到一种简单的方法来进行负载平衡,但在我的例子中,有不同的 FastAGI 调用:一个在调用开始时验证数据库中的用户,然后另一个用于检查用户的余额或他们最最近的交易,以及另一个要执行的交易。

所以我所做的是将所有验证和简单查询发送到一台服务器上的一个应用程序,并将所有事务调用发送到另一台服务器上的不同应用程序。

如果您在 zaptel/dahdi 频道上有很多来电,那么进行负载平衡的一种粗略方法是为频道使用不同的组。例如假设您有 2 个 FastAGI 服务器,以及 4 个 E1 的接听电话。您可以在 g1 组中设置 2 个 E1,在 g2 组中设置另外 2 个 E1。然后你像这样声明全局变量:

[全局]
serverg1=ip_of_server1
serverg2=ip_of_server2

然后在您的拨号计划中,您像这样调用 FastAGI:

AGI(agi://${server${CHANNEL(callgroup)}}/some_action)

在属于组 g1 的频道上,这将解析为 serverg1,serverg1 将解析为 ip_of_server1;在属于 g2 组的频道上,CHANNEL(callgroup) 将解析为 g2,因此您会得到 ${serverg2},它解析为 ip_of_server2。

这不是最好的解决方案,因为通常调用开始在一个跨度然后另一个,等等,所以一台服务器会得到更多的工作,但它的东西。

为了获得真正的负载平衡,我想我们必须编写一个 FastAGI 负载平衡网关,这根本不是一个坏主意......

于 2009-06-12T15:16:37.240 回答