使用 redis 水平扩展 socket.io

Posted

技术标签:

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

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

                 LoadBalancer (nginx)

      Proxy1      Proxy2      Proxy3      ProxyN

 BackEnd1   BackEnd2   BackEnd3   BackEnd4   BackEndN

我的问题是,使用socket-io redis模块,如果它们全部连接到同一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 的能力。

【讨论】:

您好,感谢您的回复。出于某种原因,这仍然对我不起作用。你能看看这个线程,让我知道最好的方法吗? ***.com/questions/34325229/…

以上是关于使用 redis 水平扩展 socket.io的主要内容,如果未能解决你的问题,请参考以下文章

Redis5的高可用集群的水平扩展和集群选举原理的分析

RedisRedis Cluster集群之水平扩展

pika集群水平扩展——让性能容量不再受限

基于Custom Metrics API的CoreDns水平扩展

30_redis cluster通过master水平扩容来支撑更高的读写吞吐+海量数据

Redis