私は、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: WebSockets
gen_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 の作成者は、これについて何か言うことができます。ありがとうございます