V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   imherer · 68 天前 · 772 次点击
    这是一个创建于 68 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 回复  |  直到 2017-09-14 13:06:56 +08:00
        1
    aru   68 天前 via iPhone   ♥ 1
    1. nginx 非常稳定,负载均衡的开销也很小,一般不会成为瓶颈,如果不是服务器本身原因,也很难挂掉。
    2. socket 服务器在后端通过某种方式选举每个房间的主动发起指令 socket 服务
        2
    t123yh   68 天前 via Android   ♥ 1
    后端可以使用消息队列来管理推送。
        3
    imherer   68 天前
    @aru 但是毕竟只有只有一台,还是不够保修。 不知道 Nginx 通用的做法是什么
        4
    imherer   68 天前
    @t123yh 好的,谢谢。我看看消息队列。
        5
    mooncakejs   68 天前   ♥ 1
    socket.io 自己维护了 session,也支持断线重连,所以用 tcp 代理就够了。
        6
    imherer   68 天前
    @mooncakejs 能详细点吗? 这块不是很懂。Nginx 的 ip_hash 是可以实现的对吧?
        7
    mooncakejs   68 天前   ♥ 1
    @imherer socket.io 负载均衡关键的不是前面是 nginx 还是 slb 或者 haproxy 之类,而是 socket.io Adapter 可以同步事件消息, 如果你担心 nginx 会造成单点故障,直接用 ELB 没问题的。
        8
    imherer   68 天前
    @mooncakejs
    @aru
    谢谢,但是现在对于 1 楼的 2 这个问题,我不知道怎么选举。
        9
    aru   68 天前
    @imherer
    我猜推送消耗的资源不算多,用简单的办法来实现就行了。
    将房间人数除以房间 socket 服务的数量,取编号为余数的 socket 服务
        10
    imherer   68 天前
    @aru 谢谢,我研究研究。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2439 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 181ms · UTC 10:06 · PVG 18:06 · LAX 02:06 · JFK 05:06
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1