目前一个websocket的项目, 在部署过程中使用pm2或者cluster使用多进程模式下, 连接会出现client not handshake. 但是在单线程只开一个cpu核的情况下,不会出现. 应用场景是:
- 获取token http
- 建立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 了。