请教关于 socket.io 负载均衡问题

2017-09-13 21:33:14 +08:00
 imherer

最近用 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 )如何保证多个服务器不会重复下发同样的指令呢?

2443 次点击
所在节点    程序员
10 条回复
aru
2017-09-13 22:38:56 +08:00
1. nginx 非常稳定,负载均衡的开销也很小,一般不会成为瓶颈,如果不是服务器本身原因,也很难挂掉。
2. socket 服务器在后端通过某种方式选举每个房间的主动发起指令 socket 服务
t123yh
2017-09-13 22:42:49 +08:00
后端可以使用消息队列来管理推送。
imherer
2017-09-14 10:00:54 +08:00
@aru 但是毕竟只有只有一台,还是不够保修。 不知道 Nginx 通用的做法是什么
imherer
2017-09-14 10:01:17 +08:00
@t123yh 好的,谢谢。我看看消息队列。
mooncakejs
2017-09-14 10:47:51 +08:00
socket.io 自己维护了 session,也支持断线重连,所以用 tcp 代理就够了。
imherer
2017-09-14 10:50:16 +08:00
@mooncakejs 能详细点吗? 这块不是很懂。Nginx 的 ip_hash 是可以实现的对吧?
mooncakejs
2017-09-14 11:03:38 +08:00
@imherer socket.io 负载均衡关键的不是前面是 nginx 还是 slb 或者 haproxy 之类,而是 socket.io Adapter 可以同步事件消息, 如果你担心 nginx 会造成单点故障,直接用 ELB 没问题的。
imherer
2017-09-14 11:13:40 +08:00
@mooncakejs
@aru
谢谢,但是现在对于 1 楼的 2 这个问题,我不知道怎么选举。
aru
2017-09-14 11:27:03 +08:00
@imherer
我猜推送消耗的资源不算多,用简单的办法来实现就行了。
将房间人数除以房间 socket 服务的数量,取编号为余数的 socket 服务
imherer
2017-09-14 13:06:56 +08:00
@aru 谢谢,我研究研究。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/390499

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX