Websocket 在ELB后面的多个实例中使用Socket.IO和Redis
我在负载平衡器后面运行的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来说很复杂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
有什么想法吗 当您在具有负载平衡器/反向代理、路由器等的云中运行服务器时,您需要将其配置为正常工作,尤其是当您将服务器扩展为使用多个实例时 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'})) 以下是步骤:
我也有同样的问题。你是如何解决这个问题的?你使用socket.io-redis吗?@grégoire motot,我最后只在WebSocket上使用了socket.io和socket-io-redis。要使用其他传输,如XHR轮询或JSONP轮询,您需要有粘性会话。您可能会发现本文很有用