0

Node.jsサーバーに接続しているユーザーがいて、ユーザーが参加すると、ロビー(基本的にはキュー)に追加します。ロビーに2人のユーザーがいるときはいつでも、ペアにしてロビーから削除してもらいたいです。つまり、基本的には単純なキューです。

無限ループ(呼び出し内で開始)を持つLobby.runメソッドを使用してこれを実装することから始めましprocess.nextTickた。キューに3つ以上のエントリがあるときはいつでも、それらをキューから削除します。しかし、これは私の記憶をすべて食い尽くしており、このような無限ループは一般的にお勧めできません。

私は今、経由でイベントを発行EventEmitterすることが進むべき道であると想定しています。ただし、私の懸念は同期です。私のロビーがとてもシンプルだとしましょう。

Lobby = {
  users: []

, join: function (user) {
    this.users.push(user);
    emitter.emit('lobby.join', user);
  }

, leave: function (user) {
    var index = this.users.indexOf(user);
    this.users.splice(index, 1);
    emitter.emit('lobby.leave', user);
  }
};

基本的に、ロビーに参加するユーザーを監視してペアリングすることを想定しています。おそらく次のようになります。

Lobby = {
  ...

, run: function () {
    emitter.on('lobby.join', function (user) {
      // TODO: determine if this.users contains other users,
      //       pair them off, and remove them from the array
    });
  }
}

私が言ったように、これは同期を考慮していません。複数のユーザーが同時にロビーに参加できるため、イベントリスナーは、1人のユーザーを1人ではなく、他の複数のユーザーとペアにする場合があります。

Node.jsの経験が豊富な人に、このイベントベースのアプローチに関心を持つのが正しいかどうか教えてもらえますか?このアプローチを改善するための洞察をいただければ幸いです。

4

1 に答える 1

2

あなたはこれを心配するのは間違っています。これは、Node.JSがシングルスレッドであり、同時実行性がまったくないためです。コードのブロックが起動されるたびに、ブロックが実行を終了するまで、他のコード(イベントハンドラーを含む)を起動することはできません。特に、アプリでこの空のループを定義する場合:

while(true) { }

その後、サーバーがクラッシュし、他のコードが起動したり、他のリクエストが処理されたりすることはありません。したがって、コードのブロックに注意し、各ブロックが最終的に終了することを確認してください。

質問に戻ります...したがって、あなたの場合、複数のユーザーを同じユーザーとペアにすることはできません。そしてもう一度言いましょう。これは、Node.JSに同時実行性がないためです。

一方、これはNode.JSの1つのインスタンスにのみ適用されます。それを多くのマシンに拡張したい場合は、明らかにいくつかのロックメカニズムを実装する必要があります(これにより、他のプロセスが同時にデータを処理できないようにします)。

于 2012-08-09T15:25:53.897 に答える