最近用 socket.io 做游戏服务端,按照官方的方案: https://socket.io/docs/using-multiple-nodes 做了负载均衡,主要思想就是用 Nginx 做 ip_hash。但是现在问题来了: 假如我有 S1,S2,S3 这 3 台服务器来做 socket 服务器,还有一台服务器 A 上面装了 Nginx 用来负载前面的 S1,S2,S3。这样用户一上来先连到 A,然后通过 A 分发到后面的 S1,S2,S3,但是这样 A 这台服务器就会产生单点故障,如何解决呢?
因为之前的业务基本上都是用 AWS 的 ELB,所以不存在这个问题,但是 ELB 不支持 TCP 的粘性会话,所以这里想用 Nginx 来解决。 不知道各位大大有没有更好的解决方案。
还有一个问题就是因为游戏是开房间机制的,几个用户在同一个房间内游戏(游戏时间很短,就几分钟),在游戏的过程中有一些服务端主动发起的倒计时什么的,如果我用了负载均衡(即多个 socket )如何保证多个服务器不会重复下发同样的指令呢?
1
aru 2017-09-13 22:38:56 +08:00 via iPhone 1
1. nginx 非常稳定,负载均衡的开销也很小,一般不会成为瓶颈,如果不是服务器本身原因,也很难挂掉。
2. socket 服务器在后端通过某种方式选举每个房间的主动发起指令 socket 服务 |
2
t123yh 2017-09-13 22:42:49 +08:00 via Android 1
后端可以使用消息队列来管理推送。
|
5
mooncakejs 2017-09-14 10:47:51 +08:00 1
socket.io 自己维护了 session,也支持断线重连,所以用 tcp 代理就够了。
|
6
imherer OP @mooncakejs 能详细点吗? 这块不是很懂。Nginx 的 ip_hash 是可以实现的对吧?
|
7
mooncakejs 2017-09-14 11:03:38 +08:00 1
|
8
imherer OP |
9
aru 2017-09-14 11:27:03 +08:00
|