当前位置: 首页 > 面试题库 >

Node.js,多线程和Socket.io

苏麒
2023-03-14
问题内容

我希望让Socket.io 在Node.js
v.0.6.0及更高版本中与本机负载平衡(“集群”)一起工作。

据我了解,Socket.io使用Redis存储其内部数据。我的理解是:不是要为每个工作人员生成一个新的Redis实例,而是要强制这些工作人员使用与主服务器相同的Redis实例。因此,连接数据将在所有工作人员之间共享。

像这样的主人:

RedisInstance = new io.RedisStore;

我们必须以某种方式传递RedisInstance给工人并执行以下操作:

io.set('store', RedisInstance);

受使用旧的第三方集群模块的此实现的启发,我有以下不可行的实现:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

} else {
  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

有什么想法吗?我可能完全朝错误的方向前进,有人可以指出一些想法吗?


问题答案:

实际上,您的代码应如下所示:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(8080, options);

  // Somehow pass this information to the workers
  io.set('store', new RedisStore);

  // Do the work here
  io.sockets.on('connection', function (socket) {
    socket.on('chat', function (data) {
      socket.broadcast.emit('chat', data);
    })
  });
}

另一个选择是打开Socket.IO以侦听多个端口,并具有类似HAProxy负载平衡之类的东西。无论如何,您都知道最重要的事情:使用RedisStore在流程外扩展!

资源:

http://nodejs.org/docs/latest/api/cluster.html
http://delicious.com/alessioaw/socket.io



 类似资料:
  • 多任务是一个操作系统可以同时执行多个程序的能力。基本上,操作系统使用一个硬件时钟为同时执行的每个程序配置「时间片段」。如果时间片段够小,并且机器也没有由于太多的程序而超出负荷时,那么在使用者看来,所有的这些程序似乎在同时执行着。 多任务并不是什么新的东西。在大型计算机上,多任务是必然的。这些大型主机通常有几十甚至几百个终端机和它连结,而每个终端机使用者都应该感觉到他或者她独占了整个计算机。另外,大

  • 问题内容: 我有以下控制器建议: 它在大多数情况下都有效,但是当从带有@Async注释的方法中抛出NotCachedException时,将无法正确处理该异常。 这是执行器的配置: 为了使其与@Async带注释的方法一起使用,我该怎么办? 问题答案: 如果启用了@Async,则默认的异常处理机制不起作用。要处理使用@Async注释的方法引发的异常,您需要实现一个自定义AsyncExceptionH

  • 主要内容:exec() 方法,support.js 文件代码:,master.js 文件代码:,spawn() 方法,support.js 文件代码:,master.js 文件代码:,fork 方法,support.js 文件代码:,master.js 文件代码:我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。 每个子进程总是带有三个流对象:child.stdin, child.stdout

  • 我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。 每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。 Node 提供了 child_process 模块来创建子进

  • 5.4.2.网络和多线程 有了用户界面,接下来就应该考虑用户与服务端交互的实现方法了。在此,我们引入一个三方库来帮助我们访问 Twitter 的 API 服务。 在网络调用执行中,我们会发现界面响应不灵,这是因为网络操作是不可预知的。毕竟不能让网络操作把我们的界面卡死,因此我们在这里引入Android中的多线程机制,避免不必要的外部阻塞。

  • 我有一个Android应用程序,它由一些本机线程(未连接到JVM)组成,需要能够调用Java对象的方法。 我打算这样做的方式是创建一个JNI函数,我从相关的Java对象调用它,它允许我在静态本机数据结构中获取和缓存所需的java对象方法ID、JNIEnv和对象引用,以便我的本机线程可以(线程安全地)访问所需的方法(例如,使用(*env)- 我不相信这种方法会起作用,因为我读到JNIEnv指针不能在