早在 node.js 添加工作线程之前,我就已经通过使用cluster 模块“扩展”了单线程 socket.io 应用程序。
但是由于拥有多个进程涉及(在我的情况下)大量使用 IPC,将相同的高带宽数据复制到所有工作人员会导致大量开销。所以相反 - socket.io 是否可以使用工作线程?目标是使用不止一个核心。
我可以想到两种可能的方法:
- 拥有多个完全独立的 socket.io 实例,每个实例都在自己的工作线程上运行(例如,每个实例都服务于不同的 tcp 端口——这就是我当前的集群解决方案的工作方式)
- 有一个 socket.io 实例在内部使用多个线程(在这种情况下,它可能必须做类似 epoll 的事情 - 所以我有点怀疑 socket.io 有这个内置的)
注意 由于工作线程应该用于执行 CPU 密集型 JavaScript 操作,因此从多进程切换到多线程可以获得多少收益还有待观察。但总的来说,我不希望进程内通信比进程间通信慢。此外,在工作线程的情况下,数据可以共享(而不是复制)。