服务端是提供的纯 WebSocket 服务做的游戏服务器,模块是 ws,没有用 express,使用 pm2 启动:pm2 start app.js -i max,虽然启动之后能正常显示,但是我拿虚拟机实际测试,分了 2 个 CPU 核心,本地客户端 20-30 个连接不停地发消息给服务端,结果是虚拟机的一个核心占用 50%,另一个核心 0%,测了很多次,结果都一样的,这是不是说明 pm2 不支持 Socket/WebSocket 形式的负载均衡?只支持纯 Web 服务的负载均衡?因为我看百度上对 pm2 的使用,也没说 pm2 这个负载均衡有什么问题,所以请教一下大家,是不是这么回事?
另外想问下,如果 pm2 实现不了 ws 的单机多核负载平衡,有什么其他办法可以实现?我的需求是单机多核心的原生 websocket 服务,谢谢大家.
1
imherer 2018-12-04 18:54:35 +08:00
长连接的确实没试过,不知道行不行
实在不行,你把代码复制多份,然后单核启动,一个进程一个端口😂😂 |
6
f2yx OP 请问下还有没有更好的方案 总感觉这样的思路写代码越来越复杂
|
7
dbolo123 2018-12-04 20:14:03 +08:00 via Android
把 ws 那块写成无业务无关的中间件,然后再搭个 http 后台跟中间件通信?
|
8
sunzongzheng 2018-12-04 21:26:12 +08:00 via Android
我也找过答案,只找到这个方案: 一实例一端口,cluster 模式下通过环境变量拿到当前的实例 id 递增端口号,通过 nginx 负载均衡 socket,配置 ip-hash 保证同 ip 的请求发到同一实例,实例间通信用 redis。后面想想非单机的场景,这样也能理解了
|
9
f2yx OP @sunzongzheng 谢谢
|
10
skyshy 2019-03-01 23:32:33 +08:00
PM2 官方文档已做出说明了,在 cluster 模式下,你程序的这些进程之间不能有状态或数据直接共享。可选择用 Redis 或其他数据库共享进程数据。
|