start_timer/3
Erlang で開発された私の websocket サーバーでは、クライアントから "ping" を受信せずにタイムアウトが経過した場合に接続を終了するために、接続ごとにタイマー ( ) を使用したいと考えています。
多数のクライアント接続があると仮定すると、Erlang タイマーは適切にスケーリングされますか?
多数の接続とは何ですか? Erlangs VM は内部でタイマー ホイールを使用してタイマーを処理するため、数千の接続までかなりうまくスケーリングします。するとトラブルに巻き込まれる可能性があります。
通常、トリックはタイマーで pid をグループ化することです。これは、カーネルが行う傾向があることでもあります。たとえば、200 ミリ秒で起動する必要があるタイマーがある場合は、次ではなく、次の 200 ミリ秒タイマーを前もってスケジュールします。これは、少なくとも 200 ミリ秒、おそらく 400 ミリ秒 (通常は 300 ミリ秒) 待機することを意味します。このようにタイマーを概算すると、1 つのタイマーで多数のプロセスを一度にウェイクアップできるため、さらに多くのプロセスを実行できます。ただし、タイマーの頻度とタイマーの量によっては、標準send_after/3
で十分な場合があります。
いずれにせよ、私はそれがスケーリングできると仮定することから始め、それができない場合は、上記の想定のようなおおよそのタイミングを実行することで問題を処理します.
この種のサーバーの通常のパターンは、軽量の Erlang プロセスを利用して、接続ごとにサーバーを作成することです。
たとえば、両方を提供する gen_server 動作を使用してサーバーを構築できます
良い点は、各サーバーが単一のクライアントを処理する必要があるため、作成が非常に簡単になることです。
init フェーズでは、接続を待機している 1 つのサーバーを起動する必要があります。
次に、接続時にサーバーは次のクライアントの準備ができた新しいものを起動し(理想的には、simple_one_for_one 子を起動するスーパーバイザーを介して)、ログイン手順またはやりたいことは何でもします。
サイト LearnYouSomeErlang、特にhttp://learnyousomeerlang.com/supervisorsの章と次の章で、非常に興味深い情報を見つけることができます。