繁体   English   中英

我可以在工作线程中使用节点 http 服务器吗

[英]Can I use node http server in worker threads

我知道集群模块,但对 worker_threads 有疑问。

代码示例

const { Worker, isMainThread, threadId } = require('worker_threads')
const { createServer } = require('http')

if (isMainThread) {
  let w1 = new Worker(__filename)
  let w2 = new Worker(__filename)
} else {
  const server = createServer((req, res) => {
    res.end(`response from thread ${threadId}`)
  })
  server.listen(8080, () => {
    console.log(`Thread ${threadId} is listening ${server.address().port}`)
  })
}

当我在 Windows 上运行此代码时,出现明显错误

Error: listen EADDRINUSE: address already in use :::8080

但它在 WSL 上没有错误

$ node ./index.js
Thread 2 is listening 8080
Thread 1 is listening 8080

但是在浏览器中,我总是只能从单个工作人员那里得到响应,这取决于他们开始的顺序

我可以在工作线程中监听单个 http 端口吗? 如果是,如何在此端口上进行负载平衡? 为什么 nodejs 允许在 WSL 上监听相同的端口?

不,您不能在工作线程中侦听同一端口。 在 Linux (Debian 10) 上,您的代码失败并出现预期错误Error: listen EADDRINUSE: address already in use:::8080 as well。 预计它会在生产环境中失败。

这样做的原因是,尽管 Linux 确实支持通过 SO_REUSEPORT 共享端口,但这是一个相当新的功能,并且libuv没有实现该标志(至少不适用于tcp )。 我不知道为什么 WSL 不会为您产生错误,但正如您所看到的,它不会进行负载平衡。

以下是实现负载平衡的方法:改用cluster模块,因为它就是为此而设计的。 或者,监听不同的端口并使用单独的负载均衡器——不过,如果处理是完全独立的,最好生成单独的、独立的进程,而不是使用worker_threads模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM