2016-10-20 25 views
1

私はルーム、ロビーなどで動作するゲームを作ろうとしています(チャットアプリを想像してください)。ワーカー間で動的オブジェクトを共有する方法は?

は、どのように私は、このオブジェクトは、(イベントに)正確に取得することができます

var EventEmitter = require('events'); 

class Room extends EventEmitter { 
    constructor (id, name) { 
    super(); 

    this.id = id; 
    this.name = name; 
    this.users = []; 
    } 
} 

Room.prototype.addUser = function (user) { 
    if(this.users.indexOf(user) === -1) { 
     this.users.push(user); 
     this.emit('user_joined', user); 
    } else { 
    /* error handling */ 
    } 
}; 

module.exports = { 
    Room: Room, 
    byId: function (id) { 
     // where should I look up? 
    } 
}; 

私はモジュールroom.jsを持っている、のは、言ってみましょうか?このオブジェクトによって生成されたイベントにはどうすればアクセスできますか?ノードの単一のインスタンスで

、私のようなものだろう。また

var rooms = []; 
var room = new Room(1234, 'test room'); 
room.on('user_joined', console.log); 
rooms.push(room); 

を、私はかなり理解していないかのRedisを実際に支援している(それが持つEventEmitterの交換である?)

よろしく。

EDIT:PM2ソリューションも受け入れますか。

答えて

0

Nodeの部屋を扱う代わりに、Redisのチャンネルで置き換えることができます。

新しいクライアントが部屋に入りたい場合、NodeJSアプリはこの部屋のID(つまりチャンネルの名前)を返し、クライアントsuscribesを選択した部屋に返します直接のRedisに接続されている。

あなたは部屋のリストを管理するためにRedis Setを使用することができます。このシナリオでは

、あなたはどんなイベント・エミッターを必要としない、とあなたのノードサーバはステートレスです。

そうでない場合それはインターネット上でRedisが公開されることを意味します(ゲームが公開されていると仮定して) Redis authenticationを有効にしてください。このソリューションの大きな問題は、すべてのクライアントにサーバーのパスワードを与える必要があることです。したがって、確実に安全ではありません。さらに、Redisのパフォーマンスではブルートフォース攻撃が許可されているため、インターネットに公開することはお勧めしません。 Redisがバックエンドとして使用されていても、すべての通信はNodeインスタンスを経由する必要があると私は考えています。

これを解決するには、socket.ioを使用してNodeとクライアント間のソケットを開き、Nodeインスタンス(クライアントではない)をRedisチャネルに登録することができます。 Redisによってメッセージが発行されると、ソケットを介してクライアントに送信されます。さらに、有効なクライアントだけが特定のチャネルに接続するように、認証のレイヤーを追加します。

イベントエミッタは必須ではありません。これは、イベントエミッタになるRedisクライアントです(example based on ioRedis

+0

ありがとうございました! – Nika

関連する問題