【问题标题】:Horizontally scale socket.io with redis使用 redis 水平扩展 socket.io
【发布时间】:2016-03-16 23:45:54
【问题描述】:

我目前正在创建一个水平可扩展的 socket.io 服务器,如下所示:

                 LoadBalancer (nginx)

      Proxy1      Proxy2      Proxy3      Proxy{N}

 BackEnd1   BackEnd2   BackEnd3   BackEnd4   BackEnd{N}

我的问题是,使用socket-io redis模块,如果它们全部连接到同一redis服务器,我可以向连接到一个代理服务器之一的特定套接字发送消息吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: node.js redis socket.io scaling socket.io-redis


    【解决方案1】:

    由于你想扩展socket.io服务器,并且你已经使用nginx作为负载均衡器,不要忘记设置sticky load balancing,其他单个连接将连接到基于负载均衡器的多个服务器通过连接到套接字。 io服务器。所以最好使用sticky load balancing

    使用redis socket io适配器,您可以在Redis Pub/Sub implementation的帮助下与一个或多个socket.io服务器发送和接收消息。

    如果您告诉我代理和后端使用哪种技术,我会告诉您更多相关信息。

    【讨论】:

    • 所有服务器都使用 Node.js,我只是想问如果它们都连接到同一个 redis 存储,我如何从其中一个后端服务器向客户端发出。
    【解决方案2】:

    使用 socket.io-redis 模块,您的所有后端服务器都将共享同一个连接用户池。您可以从 Backend1 发出,如果客户端连接到 Backend4,他将收到消息。

    使用 Socket.io 进行这项工作的关键是在 nginx 上使用粘性会话,这样一旦我的客户端连接,它就会保持在同一台机器上。这是因为 socket.io 以一个 WebSocket 和几个长轮询线程开头的方式,它们都需要在同一个后端服务器上才能正常工作。

    您可以将客户端连接选项更改为仅使用 Websockets,而不是固定会话,这将消除与多个服务器的多个连接的问题,因为只有一个连接,即单个 Websocket。这也将使您的应用程序失去降级到长轮询而不是 WebSockets 的能力。

    【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2012-08-16
    • 2017-02-03
    • 2012-09-17
    • 2014-11-25
    • 2013-08-09
    • 2011-08-05
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多