2016-10-20 8 views
1

방, 로비 등에서 작동하는 게임을 만들려고합니다 (추가 체크/정보 저장을 제외하고는 채팅 앱을 상상해보십시오).직원들간에 동적 객체를 공유하는 방법은 무엇입니까?

이의 말을하자, 나는 모듈 room.js이

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? 
    } 
}; 

이 어떻게 (사건에) 정확히이 객체를 얻을 수 있나요? 이 객체에 의해 생성 된 이벤트에 어떻게 액세스 할 수 있습니까? 노드의 단일 인스턴스에서

, 나는 같은 것을 할 것 : 또한

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

을, 나는 아주 이해되지 않는 방법 레디 스 실제로 돕고있다 (이것은 EventEmitter의 대체?)

감사를 .

EDIT : PM2 솔루션도 허용합니다.

답변

0

Node의 방을 처리하는 대신 Redis의 채널로 대체 할 수 있습니다.

새 클라이언트가 방에 들어가기를 원할 때 NodeJS 앱은이 방의 ID (즉 채널 이름)를 반환하고 클라이언트 suscribes을 선택한 방 (클라이언트는 다음과 같습니다. 직접 레디 스에 연결.

당신은 객실의 목록을 관리 할 Redis Set을 사용할 수 있습니다.

이 시나리오에서는, 당신은 어떤 이벤트 이미 터를 필요로하지 않으며, 노드의 서버는 무 상태입니다.

을 그렇지 않으면 , Redis가 인터넷 상에 공개된다는 것을 의미합니다 (게임이 공개되어 있다고 가정 할 때). Redis authentication을 활성화하십시오. 이 솔루션의 주요 문제점은 모든 클라이언트에 서버 비밀번호를 제공해야한다는 것입니다. 따라서 확실히 안전하지 않습니다.또한 Redis의 퍼포먼스는 무차별 공격을 허용하므로 인터넷에 노출시키는 것은 좋지 않습니다. Redis가 백엔드로 사용 되더라도 모든 통신은 Node 인스턴스를 통과해야한다고 생각합니다.

이 문제를 해결하려면 socket.io를 사용하여 Node와 클라이언트 사이의 소켓을 열고 클라이언트가 아닌 Node 인스턴스를 Redis 채널에 가입 시키십시오. Redis에서 메시지를 게시하면 소켓을 통해 클라이언트에 메시지를 보냅니다. 또한 유효한 클라이언트 만 주어진 채널에 연결되도록 인증 계층을 추가하십시오.

이벤트 발생기는 필요하지 않습니다. 이벤트 발생기가 될 Redis 클라이언트입니다 (example based on ioRedis)

+0

감사합니다. – Nika