关于负载均衡和node单线程的问题
发布于 4个月前 作者 lonso 431 次浏览 来自 问答

目前一个websocket的项目, 在部署过程中使用pm2或者cluster使用多进程模式下, 连接会出现client not handshake. 但是在单线程只开一个cpu核的情况下,不会出现. 应用场景是:

  1. 获取token http
  2. 建立ws连接

错误原因是: 获取token 是在 cpu 1上,建立连接在cpu2上,所以就出client not handshake.如果两次都在同一个cpu上那么就不会出现这个问题.

错误原因猜想: 会不会在建立ws连接的时候,进程被切换了?

有没有高人求解.

6 回复

我猜也是内存共享这方面的问题。

如果两次都在同一个cpu上那么就不会出现这个问题 这句应该是 如果两次都在同一个进程里那么就不会出现这个问题

想办法让 token 不使用内存来维护,而是使用一个 redis store 之类的东西,这样就可以多进程一起读取了嘛。

@alsotang 对哈,是这么个意思,同一个进程就不会,但是似乎不是token的问题,在建立连接过程前用socketio的验证,debug看了下,是通过了验证了的. token是存在redis里面,取出来验证的.

@lonso 我考察了一下,socket.io 不像 http 那样的无状态,所以建议你使用 https://github.com/indutny/sticky-session 配合 cluster 模块。不要用 pm2 了。

@alsotang ok,谢了,先看看先

回到顶部