Как я могу загрузить баланс FastAGI? - PullRequest
3 голосов
/ 11 июня 2009

Я пишу несколько AGI с использованием Perl, которые будут вызываться из абонентской группы Asterisk. Я ожидаю получить множество похожих вызовов, поэтому мне нужен способ их балансировки нагрузки. Мне посоветовали использовать FastAGI вместо AGI. Проблема в том, что мои AGI будут распределены по многим серверам, а не по одному, и мне нужно, чтобы моя точка входа Asterisk распределяла вызовы между этими серверами (где находятся агисы) в зависимости от их доступности. Итак, я подумал о предоставлении приложению FastAGI нескольких IP-адресов вместо одного. Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 15 июня 2012

Любой обратный прокси TCP сделает свое дело. HAProxy является одним и nginx с TCP-модулем , являющимся другим.

Некоторое время назад я создал свой собственный прокси FastAGI, используя node.js ( nodast ) для решения этой очень специфической проблемы и немного больше, включая возможность запуска протокола FastAGI через SSL и маршрутизации запросы на основе местоположения и параметров запроса 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; 
1 голос
/ 26 июня 2010

Меххх ... использовать те же конструкции, которые применяются для балансировки нагрузки, например запросы веб-страниц.

Один из способов - циклический перебор в 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, должны иметь возможность маршрутизации между несколькими серверами с дополнительным преимуществом, заключающимся в том, чтобы «вынуть один» из смеси для обслуживания или выполнять более сложную балансировку, как распределять поровну в зависимости от текущей нагрузки.

1 голос
/ 12 июня 2009

У меня есть большая реализация IVR с использованием FastAGI (24 E1 все делают вызовы FastAGI, пиковые значения около 80%, так что почти 600 каналов Asterisk вызывают FastAGI). Я не нашел простого способа балансировки нагрузки, но в моем случае есть разные вызовы FastAGI: один в начале вызова для проверки пользователя в базе данных, затем другой, чтобы проверить баланс пользователя или его наиболее недавние транзакции и еще одна транзакция.

Итак, я отправил все проверочные и простые запросы одному приложению на одном сервере и все вызовы транзакций другому приложению на другом сервере.

Грубым способом балансировки нагрузки, если у вас много входящих вызовов на каналах zaptel / dahdi, было бы использование разных групп для каналов. Например, предположим, у вас есть 2 сервера FastAGI и 4 E1, принимающих вызовы. Вы можете установить 2 E1 в группе g1 и 2 других E1 в группе g2. Затем вы объявляете глобальные переменные следующим образом:

[globals]
serverg1=ip_of_server1
serverg2=ip_of_server2

Затем в вашем плане набора номера вы называете FastAGI следующим образом:

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

На каналах, принадлежащих группе g1, которые преобразуются в serverg1, которые преобразуются в ip_of_server1; на каналах, принадлежащих группе g2, CHANNEL (callgroup) преобразуется в g2, поэтому вы получаете $ {serverg2}, который преобразуется в ip_of_server2.

Это не лучшее решение, потому что обычно звонки начинают поступать с одного промежутка, а затем с другого и т. Д., Так что один сервер получит больше работы, но это что-то.

Чтобы получить реальную балансировку нагрузки, я думаю, нам нужно написать шлюз балансировки нагрузки FastAGI, это неплохая идея ...

...