我应该采取什么方法在Node.js中创建“大厅”?

时间:2012-08-09 14:29:53

标签: events node.js synchronization queue

我有用户连接到Node.js服务器,当他们加入时,我将它们添加到一个Lobby(本质上是一个队列)。任何时候大厅里有2个用户,我希望他们配对并从大厅中移除。从本质上讲,它只是一个简单的队列。

我开始尝试使用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经验的人能否告诉我,我是否应该关注这种基于事件的方法?任何改进这种方法的见解都会非常感激。

1 个答案:

答案 0 :(得分:2)

你担心这个是错的。这是因为Node.JS是单线程的,根本没有并发性!每当触发代码块时就不会触发其他代码(包括事件处理程序),直到该块完成它的操作。特别是如果你在app中定义这个空循环:

while(true) { }

然后您的服务器崩溃,其他代码都不会触发,也不会处理其他任何请求。所以要小心代码块,确保每个块最终都会结束。

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

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