2011-07-19 10 views
0

クライアント/ブラウザが接続するたびに Mochiwebサーバー、それはループの新しいプロセスを作成しますか?だから、 があるクライアントから別のクライアント(一般的なチャットシステム)にメッセージを転送したい場合は、 は、接続されたすべてのクライアントPIDを格納するためにLoopのself()を使用する必要がありますか?
Erlang/Mochiweb初心者の質問abtクライアントの通信

何か(またはすべて)がある場合は、間違った、これまでのplz システムはどこのサーバプロセスであり、どこのクライアント・プロセスが、どのように動作するかを簡単に私に説明?

どのようにそのPIDを使用してクライアントのループプロセスにメッセージを送信するのですか?私はどこに ループに "受信"を置くことを意味しますか?

答えて

1

Here's a good articleについてMochiweb Web Chatの実装について。 HTTPクライアントは、ステートレスなプロトコルなので、PIDはありません。クッキーを使用して、チャットルームの一意の訪問者にリクエストを接続することができます。

0

まず、研究の権利を行ってください。チェックアウト:this articlethis one、次にthis last oneです。

mochiwebプロセスは、他のアプリケーションサーバー(gen_server、多くのスーパーバイザを持つOTPアプリのワーカー、他の分散ワーカーe.t.c)にチャットデータを持ち込ませます。 mochiwebプロセスのPIDに依存するべきではありません。ユーザーを一意に識別する別の方法があります。 Cookie、セッションID、認証トークンアプリケーションによってのみ管理されるもの。 mochiwebがチャットデータを利用できるようになるとただちにサーバーに送信します。すべてのユーザーがメッセージキューを持ち、他のユーザーがチャットメッセージを投稿しているときに、何らかの種類のキューイングを行うことができます。次に、mochiwebプロセスは、各接続時にユーザーに利用可能なメッセージがあるかどうかを尋ね続けます。つまり、HTTPロングポーリング/ COMET、REST/Serverプッシュ/キープアライブ接続はぼやけぼやけをぼやけます。フォールトトレラントにして、チャットエンジンにはmochiwebプロセスを含まないようにしてください。 mochiwebを運んでチャットしてみましょう。

+0

ありがとうございました。%) 私は記事を見ましたが、私はまだOTPライブラリの学習を始めていないということです。 私はあなたの答えに関して1つの質問を持っています。私はmochiwebが宛先クライアントにメッセージを配信することだけを気にするべきだと理解しています。そして、別のサーバは、他の多くのmochiwebプロセス(接続されたクライアントの数だけ多くのもの)の中から適切なmochiwebプロセスにメッセージを転送するのに気を付けるべきでしょうか?どのようにサーバがmochiweb procのPIDを知らずに特定のmochiwebにメッセージを伝えるのか? – Acute

0

PIDを識別情報として使用しないようにするには、いくつかのデータ構造を使用できます。キュー()の例を考えてみましょう。あなたが明らかに一意に識別可能なキュー()をユーザごとに実装したRAMテーブルを持つ複製された記憶媒体データベースがあるとします。ユーザーへの接続を保持しているプロセス(mochiwebプロセス)は、このユーザーセッションのIDのみを保持します。その後、このアイデンティティーを使用して、定期的にMnesiaのキュー()にチェックインします(このようにして、ユーザーセッションの間はmochiwebプロセスを有効に保ちます)。プロセスがユーザーIDを持っている限り、どのプロセスPIDが接続されていても、メッセージキューからメッセージをフェッチ(読み込み)できます。結果として、ユーザが複数のクライアントセッションを有する可能性が生じる。同じプロセスでこのIDを使用して、このユーザーからのメッセージを他のユーザーのキューにダンプできます()。