2012-10-20 12 views
6

Erlangで開発されたwebsocketサーバーでは、クライアントから「ping」を受信せずにタイムアウトが経過すると、接続ごとにタイマー(start_timer/3)を使用して接続を終了したいと考えています。Erlangタイマーのスケールは?

Erlangのタイマーは、クライアント接続の数が多いと仮定して、適切に拡張されますか?

答えて

8

多数の接続とは何ですか? Erlangs VMはタイマーホイールを内部的に使用してタイマーを処理するので、数千もの接続まで拡張できます。その後、あなたは困ってしまうかもしれません。

通常、トリックはpidsをタイマーでグループ化することです。これはまた、カーネルがする傾向があります。たとえば、200ミリ秒で目を覚まさなければならないタイマーがある場合は、次の時間ではなく、次の200ミリ秒のタイマーを再度スケジュールします。これは、少なくとも200ms、おそらく400ms、典型的な300msを待つことを意味します。このようなタイマーを近似することで、1つのタイマーで大量のプロセスを一度に起動させることができるため、さらに多くのタスクを実行できます。しかし、タイマーの頻度とタイマーの量に応じて、標準send_after/3で十分かもしれません。

いずれにしても、私は、それがスケーリング可能であると仮定して開始し、上で想定したようなおおよそのタイミングを取ることができなければ問題を処理します。

0

この種のサーバーの通常のパターンは、軽量のErlangプロセスを利用し、接続ごとにサーバーを作成することです。

あなたはあなたの両方

を提供gen_server行動
  • 状態変数との接続(接続を待って、ログイン、...)、
  • を管理するためのさまざまな状態を使用して、たとえば、サーバーを構築することができます
  • 各接続および各状態での個々のタイムアウトは、VMおよびOTPの動作によって管理されます。

素晴らしいことは、各サーバーが単一のクライアントを処理しなければならないということです。したがって、書くのが簡単です。

初期化フェーズは、

を接続待ちの一つのサーバを起動する必要がありますが、接続上のサーバは、(理想的にsimple_one_for_one子を起動するスーパーバイザーによる)次のクライアントのための準備ができて新しいものを起動し、ステップまたは何でもログインして行く必要がありますやってみたいです。

LearnYouSomeErlangのサイト、特にhttp://learnyousomeerlang.com/supervisorsの章にある、非常に興味深い情報があります。