Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Websocket 在ELB后面的多个实例中使用Socket.IO和Redis_Websocket_Redis_Socket.io_Sails.js_Load Balancing - Fatal编程技术网

Websocket 在ELB后面的多个实例中使用Socket.IO和Redis

Websocket 在ELB后面的多个实例中使用Socket.IO和Redis,websocket,redis,socket.io,sails.js,load-balancing,Websocket,Redis,Socket.io,Sails.js,Load Balancing,我在负载平衡器后面运行的AWS上设置了两个EC2实例,但是当两个实例运行时,socket.io会中断。我假设,由于实例和Socket.io之间的ELB-round-robins在更新到WebSocket之前发送请求,这会导致Socket io中断(会话ID未知)。 我认为通过在Redis上使用共享会话存储,Socket.io可以工作,因为所有实例都可以访问会话 我在Node.js(更具体地说是Sails.js)中开发了一个小应用程序,只是为了测试。 我设法将ELB配置为在TCP模式下支持WebS

我在负载平衡器后面运行的AWS上设置了两个EC2实例,但是当两个实例运行时,socket.io会中断。我假设,由于实例和Socket.io之间的ELB-round-robins在更新到WebSocket之前发送请求,这会导致Socket io中断(会话ID未知)。 我认为通过在Redis上使用共享会话存储,Socket.io可以工作,因为所有实例都可以访问会话

我在Node.js(更具体地说是Sails.js)中开发了一个小应用程序,只是为了测试。 我设法将ELB配置为在TCP模式下支持WebSocket,将请求转发给运行Sails.js应用程序的(Phusion Passenger+NGINX)

该应用程序使用在amazon Elasticache上运行的Redis进行会话和套接字。 如果我在没有ELB的情况下分别测试这两个实例,我会看到Redis正在为套接字工作,因为消息在这两个实例中发送和接收

共享会话是否足以使Socket.io正常工作?或者我需要ELB中的粘性会话将客户端转发到相同的实例

我之所以选择ELB,是因为它更容易动态添加和删除实例,这对于NGINX(Free)或HAProxy来说很复杂


有什么想法吗

当您在具有负载平衡器/反向代理、路由器等的云中运行服务器时,您需要将其配置为正常工作,尤其是当您将服务器扩展为使用多个实例时

Socket.io、SockJS和类似库的限制之一是它们需要不断地与服务器的同一个实例通信。当只有一个服务器实例时,它们工作得非常好

当您在云环境中扩展应用程序时,负载平衡器(cloud Foundry中的Nginx)将接管,请求将发送到不同的实例,导致Socket.io中断

为了在这种情况下提供帮助,负载平衡器具有一种称为“粘性会话”的功能,也称为“会话相关性”。其主要思想是,如果设置了此属性,那么在第一个负载平衡请求之后,以下所有请求都将转到同一个服务器实例

在Cloud Foundry中,为设置cookie jsessionid的应用程序启用基于cookie的粘性会话

注意:jsessionid是常用于跟踪Java/Spring应用程序中会话的cookie名称。CloudFoundry只是将其作为所有框架的粘性会话cookie

因此,所有应用程序需要做的就是设置一个名为jsessionid的cookie,以使socket.io正常工作

应用程序使用(cookieParser); use(express.session({store:sessionStore,key:'jsessionid',secret:'yoursecrethere'}))

以下是步骤:

  • Express设置名为jsessionid的会话cookie
  • 当socket.io连接时,它使用相同的cookie并点击负载平衡器
  • 负载平衡器始终将其路由到设置cookie的同一服务器
  • 如果您使用的是应用程序负载平衡器,则粘性会话设置位于目标组级别

  • 我也有同样的问题。你是如何解决这个问题的?你使用socket.io-redis吗?@grégoire motot,我最后只在WebSocket上使用了socket.io和socket-io-redis。要使用其他传输,如XHR轮询或JSONP轮询,您需要有粘性会话。您可能会发现本文很有用