2012-08-09 44 views
0

我有用户连接到一个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经验的人告诉我,如果我正确地关注这种基于事件的方法吗?任何有关改进这种方法的见解都将非常感激。

回答

2

你是错误的关心这一点。这是因为Node.JS是单线程的,根本没有并发性!每当一块代码被触发时,其他代码(包括事件处理程序)可以被触发,直到块完成它所做的事情。特别是,如果你在你的应用程序定义了这个空循环:

while(true) { } 

那么你的服务器崩溃,没有其他的代码永远不会火,没有其他的请求将被处理过。所以要小心代码块,确保每个块最终都会结束。

回到问题...所以在你的情况下,多个用户不可能与同一个用户配对。让我再说一次:这只是因为Node.JS没有并发性!

另一方面,这仅适用于Node.JS的一个实例。如果你想把它扩展到许多机器上,显然你必须实现一些锁定机制(这可以确保没有其他进程可以同时处理数据)。

+2

真棒,这是非常好的知道,并且肯定有助于解释Node如何更好地工作。 :)是的,当我的代码中有无限循环时,我从来没有看到我的服务器启动,这是你的文章解释的。 – 2012-08-09 15:34:17

+1

一旦你想运行你的服务器的多个实例并共享等待用户的同一个“队列”,我建议将这个队列存储在数据库中,比如redis和原子列表动作。 – rdrey 2012-08-09 19:43:01

相关问题