1

私は、Misultin のWeb ソケットのサポートに感銘を受けたと言わざるを得ません (ここにいくつかの例があります)。私の JavaScript はリクエストを発行し、「ごくわずかな」遅延またはラグで応答を取得しています。すばらしい !!

WebSocket のデータ ハンドラ ループがどのように見えるかを見ると、少なくとも Erlang の基本的な方法では、通常の TCP/IP ソケットのループに似ています。

受信した websocket データの % コールバック
handle_websocket(Ws) ->
    受け取る
        {ブラウザ、データ} ->
            Ws:send(["受信 '", データ, "'"]),
            handle_websocket(Ws);
        _無視 ->
            handle_websocket(Ws)
    5000以降 ->
        Ws:send("プッシュ!"),
        handle_websocket(Ws)
    終わり。

このコードは、Misultin によって生成されたプロセスで実行されます。これは、以下のようにサーバーを起動するときに指定する関数です。

開始(ポート)->
    HTTPHandler = fun(Req) -> handle_http(Req, Port) 終わり、
    WebSocketHandler = fun(Ws) -> handle_websocket(Ws)終わり、
    オプション = [{ポート、ポート}、{ループ、HTTPHandler}、{ws_loop、WebSocketHandler}]、
    misultin:start_link(オプション).
. これに関するその他のコードについては、サンプル ページをご覧ください。
いくつか質問があります。

質問 1: Erlang の TCP/IP ソケットで通常行うように、Web ソケットの制御プロセスを変更できますか? 質問 2: WebSocketsgen_tcp:controlling_process(Socket,NewProcessId)をサポートする唯一の Erlang/OTP HTTP ライブラリはMisultinですか? 残りはどこですか?

編集: さて、Misultin から WebSocket コントロールを転送できるようにする必要がある理由は、
WebSocket のプールを制御することを 考えてくださいgen_server。たとえば、ゲームサーバーです。現在の Misultin の例では、すべての WebSocket 接続に対して制御プロセスがあります。つまり、すべての WebSocket に対して生成されたプロセスがあります。今、私はErlangがプロセスを持つヒーローであることを知っていますが、私はこれを望んでいませんgen_server.WebSocketの制御権限を処理するとすぐにこれらの初期プロセスが終了することを望んでいます. これらの WebSocket 間でデータを切り替える
には、これが必要です。現在の実装では、Misultin の handle_websocket プロセスを次のようにgen_server追跡する必要があります。Pid

%% misultin の制御プロセスは次のとおりです。
%% Pid を取得し、どこかに保存します
%% を my_gen_server にリンクして、
%% 終了する場合は、なくなったことを知っています

handle_websocket(Ws)->
    process_flag(trap_exit,true),
    Pid = 自己()、
    リンク (my_gen_server)、
    save_connection(Pid),
    wait_msgs(Ws)。

wait_msgs(Ws)->
    受け取る
        {ブラウザ、データ}->
            FromPid = 自己()、
            send_to_gen_server(データ、FromPid)、
            handle_websocket(Ws);
        {放送、メッセージ} ->
            %% 接続されているすべての WebSocket にブロードキャストできます      
            Ws:send(メッセージ),
            handle_websocket(Ws);
        _Ignore -> handle_websocket(Ws)  
    終わり。

上記のアイデアは非常にうまく機能し、すべての制御プロセスを Mnesia Ram テーブルに保存し、アプリケーションが特定のユーザーにメッセージを送信したい場合は、特定の基準に照らして検索します。ただし、私が達成したいことでは、現実の世界ではプロセスが多すぎてサーバーがクラッシュする可能性があることに気付きました。Web Socket ごとにプロセスを用意するよりも、少なくとも 1 つで何千もの Web Socket を制御したいのでgen_server、メモリを節約できます。

提案: Misultin の作成者は、彼の次のリリースで Web ソケット グループの実装を作成してくれる可能性があります。これにより、WebSocket のグループを同じプロセスで制御できます。これは次のようになりますNitrogen's Comet Groups彗星のつながりが同じ制御下にグループ化されます。これが不可能な場合は、これらの Web ソケットの制御を引き継ぐことができる API を提供して、自分で制御する必要があります。

エンジニアはこれについてどう思いますか?
これについてのあなたの提案やコメントは何ですか?

Misultin の作成者は、これについて何か言うことができます。ありがとうございます

4

3 に答える 3

4

(1) カウボーイの開発者です。

一連の Websocket 接続の制御を担当する、あらゆるタイプの中央サーバーを使用することはお勧めしません。主な理由は、これが時期尚早の最適化であるためです。メモリ使用量について推測しているだけです。

昨年初めに単一サーバーで 50 万の Websocket 接続に対して行われたテストでは、websocket プロセスが休止しているかどうかに応じて、20GB のメモリを使用した場合に misultin が発生し、カウボーイは 16.2GB または 14.3GB を使用しました。Websocket のすべての erlang 実装は、これらの数値に非常に近いと想定できます。

休止状態を使用しないカウボーイとミスルチンの違いは、接続ごとに余分なプロセスを使用することによるメモリ オーバーヘッドにかなり近いはずです。(このostinelliで私を自由に修正してください)。

タスク/リソースとプロセス間の 1:1 マッピングがないアプリケーションの問題を設計して解決するよりも、サーバーを購入するときにこれを考慮に入れる方がはるかに安価であると確信しています。

https://twitter.com/#!/nivertech/status/114460039674212352

于 2012-01-11T21:08:40.197 に答える
2

Misultinの作者はこちら。

制御プロセスを変更することは、Misultinの内部をすべて破壊するため、強くお勧めしません。Steveが提案したように、YAWSとCowboyはWebSocketをサポートしており、Mochiwebを介して実装が行われてますが、積極的に保守されていることに気づいていません。

あなたは記憶の問題について話し合っていますが、私はあなたが概念を混ぜ合わせていると思います。gen_serverからすべてを「一元的に」制御する必要がある理由がわかりません。「多くのプロセスがVMをクラッシュさせる」という仮定は実際には間違っています。Erlangはアクターのモデルに基づいて構築されており、これには多くの利点があります。

  • 単一のgen_serverを使用する場合には存在しない、マルチコアの使用によるパフォーマンス
  • 「クラッシュさせる」という哲学を使用できる:現在、gen_serverがクラッシュすると、利用可能なすべてのゲームがダウンするようです。
  • ..。

Erlangは単一のVMで数十万のプロセスを処理することができ、それが発生する前に、開いているソケットで使用可能なファイル記述子がなくなります。

したがって、個々のWebsocketプロセス内にゲームロジックを配置し、メッセージパッシングを使用してそれらを相互作用させることを検討することをお勧めします。たとえば、単一のゲームの参加者とステータスの情報を保持する「ゲームプロセス」の生成を検討できます。最終的には、利用可能なゲームを追跡し、それのみを実行するgen_server 最終的にはETSテーブルを所有することによって)。それは私がおそらく行きたい方法であり、すべて適切な監督者の構造を持っています。

明らかに、あなたが何を達成しようとしているのかわからないので、ここで仮定しています。しかし、あなたの懸念がメモリである場合-まあ、試行錯誤の経験がここで以下に述べたように:特に、Erlangを実際にそれができることを制限するように見える方法で使用することを検討しているときは、何かを時期尚早に最適化しないでくださいの。

私の0.02ドル。

于 2012-01-11T03:26:32.063 に答える
2

質問 1 についてはわかりませんが、質問 2 については、YawsCowboyも WebSocket をサポートしています。

于 2012-01-10T19:51:24.943 に答える