3

私は、Asteriskダイヤルプランから呼び出されるPerlを使用して複数のAGIを作成しています。同時に多数の呼び出しを受信することを期待しているので、それらの負荷を分散する方法が必要です。AGIの代わりにFastAGIを使用するようにアドバイスされています。問題は、AGIが1つだけでなく多くのサーバーに分散されることです。また、エントリポイントのAsteriskが、可用性に基づいてそれらのサーバー(agiが存在するサーバー)間で呼び出しをディスパッチする必要があります。そこで、FastAGIアプリケーションに1つではなく複数のIPアドレスを提供することを考えました。出来ますか?

4

3 に答える 3

2

どんな TCP リバース プロキシでもうまくいきます。HAProxyが 1 つ、nginxTCP モジュールがもう 1 つです。

少し前に、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

FastAGI を使用した大規模な IVR 実装があります (24 個の E1 がすべて FastAGI 呼び出しを行っており、約 80% でピークに達するため、FastAGI を呼び出している約 600 のアスタリスク チャネルになります)。負荷分散を行う簡単な方法は見つかりませんでしたが、私の場合はさまざまな FastAGI 呼び出しがあります。1 つは呼び出しの最初にデータベース内のユーザーを検証するためのもので、もう 1 つはユーザーの残高またはそのほとんどを確認するためのものです。最近のトランザクション、およびトランザクションを実行するための別のトランザクション。

そのため、すべての検証と単純なクエリを 1 つのサーバー上の 1 つのアプリケーションに送信し、すべてのトランザクション呼び出しを別のサーバー上の別のアプリケーションに送信しました。

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 に解決され、それは ip_of_server1 に解決されます。グループ g2 に属するチャネルでは、CHANNEL(callgroup) は g2 に解決されるため、ip_of_server2 に解決される ${serverg2} を取得します。

通常、コールはあるスパンで着信し始め、次に別のスパンで着信し始めるため、1 つのサーバーでより多くの作業が行われるため、これは最善の解決策ではありませんが、それは何かです。

実際の負荷分散を実現するには、FastAGI 負荷分散ゲートウェイを作成する必要があると思いますが、これはまったく悪い考えではありません...

于 2009-06-12T15:16:37.240 に答える
1

うーん... Webページリクエストなどの負荷分散に適用されるのと同じ構造を使用します。

1 つの方法は、DNS でラウンド ロビンを行うことです。したがって、vru1.example.com 10.0.1.100 と vru2.example.com 10.0.1.101 がある場合、次のように DNS に 2 つのエントリを配置します...

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 を交互に使用する必要があります。また、必要な数のホストを追加できます。

もう 1 つの方法は、複雑すぎてここで説明することはできませんが、HAProxy のようなプロキシ ツールを使用すると、複数のサーバー間でルーティングでき、メンテナンスのためにミックスから「1 つ取り出す」ことができる、またはより高度な操作を実行できるという追加の利点があります。現在の負荷に基づいて均等に分配するように分散します。

于 2010-06-26T17:42:54.273 に答える