我有用户连接到一个Node.js服务器,当他们加入时,我将它们添加到一个大厅(本质上是一个队列)。任何时候在大厅有两个用户,我希望他们配对,并从大厅中删除。所以基本上,这只是一个简单的队列。在Node.js中创建“大厅”应该采取什么方法?
我开始试图用一个Lobby.run方法来实现这个,该方法有一个无限循环(在process.nextTick
调用中开始),并且任何时候在队列中有两个以上的条目时,我将它们从队列。然而,我发现这是在吃掉我所有的记忆,而且像这样的无限循环通常是不明智的。
我现在假设通过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
});
}
}
正如我所说,这没有考虑到同步。多个用户可以同时加入大厅,所以事件监听器可能将单个用户与多个其他用户配对,而不是一个用户。
有更多Node.js经验的人告诉我,如果我正确地关注这种基于事件的方法吗?任何有关改进这种方法的见解都将非常感激。
真棒,这是非常好的知道,并且肯定有助于解释Node如何更好地工作。 :)是的,当我的代码中有无限循环时,我从来没有看到我的服务器启动,这是你的文章解释的。 – 2012-08-09 15:34:17
一旦你想运行你的服务器的多个实例并共享等待用户的同一个“队列”,我建议将这个队列存储在数据库中,比如redis和原子列表动作。 – rdrey 2012-08-09 19:43:01