nodejs负载均衡的问题

A呀呀
  • 2
新手上路,请多包涵

背景:我的处理器是AMD 2600X,12线程
我想做一个视频播放网站,用的express框架,把视频放到public静态目录下,我发现同时打开7个播放视频的网页,再打开视频就是视频加载不出来的状态,一直转圈,我知道这是单个nodejs处理不过来了,于是用了pm2,发现在一段时间内所有请求都被分配到同一个进程上了,依然解决不了问题,再后来我换成了cluster模块,像这样去启动
然后我还写了个接口返回进程的pid,发现在一段时间里,所有的请求也是被分配到了同一个进程上,还是解决不了问题,真心的请教各位大佬们,我该怎么做才能充分的利用处理器的性能,达到流畅的播放

因为我无论怎么新建无痕窗口或者用其它浏览器访问,返回的pid都是一样的。
我顺便补充一下,如果只有一台机器,用nginx ,请求还是被分配到这台机器,还是那个进程,还是没充分利用机器的性能。
最终目的是想让每个请求,被均匀的分配到不同的进程上,像负载均衡一样

回复
阅读 777
1 个回答
linong
  • 26.4k
✓ 已被采纳

和服务器关系不大吧?http2 试试呢?而且这种静态服务 nginx 就可以了。一般不会用 express 吧


而且这个第七个就不好使了,你不觉得是你触发了什么机制嘛?

chrome 同域名请求限制 6 个

你可以通过划分域名来测试。也可以通过手动阻塞来测试。


pm2 的话请求默认也不会落到同一个服务上,是否开启了基于 ip 的策略?


基于上面说到的,有两个方案了

  1. http2 直接复用了
  2. 多域名,解除客户端的域名限制。

我补了一个阻塞图,一个是发起十次请求,一个是

image.png

image.png

fetch(`http://localhost:3000/utils/sleep?a=1&timeout=100&data=100&setData={%22Content-Type%22:%22application/javascript%22}`)
    .then(v=>v.text())
    .then(console.log)

for( var i = 0; i < 10; i++)fetch(`http://localhost:3000/utils/sleep?a=1&timeout=99999&data=99999&setData={%22Content-Type%22:%22application/javascript%22}`)
    .then(v=>v.text())
    .then(console.log)

也补了一个同步发请求,服务端做 sleep。

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏