我们有一些服务集群。客户端通过Websocket连接到集群。客户端根据节点所属的组来定位节点(我们称其为“会议”)。
换句话说,整个一组客户端(会议)由一个特定的节点服务。因此,应该根据在启动WebSocket连接时发送的一些元数据来选择目标节点。
Client Tom Hanks connects to Actors conference -> LB routes to node EU Server
Client Tom Hanks connects to Tesla fans conference -> LB routes to node USA Server
Client Ada Zizkova connects to Actors conference -> LB routes to node EU Server
Client Ada Zizkova connects to Tesla fans conference -> LB routes to node USA Server
...
请注意,这不是基于HTTP会话的粘性。 HTTP会话对于同一用户是同一会话。
这就是我们想要的。但是目前,我们在简单的AWS Elastic Load Balancer上,我们将在内部实现这种粘性并绕过ELB。
在此之前,我正在研究ALB是否可以完成我上面描述的操作。找不到任何东西,仅此:Does an Application Load Balancer support WebSockets?看起来像是一般的连接粘性。参见AWS docs here。
如何使用ALB使基于元数据的WebSocket保持粘性? (或与AWS中的其他功能结合使用。)
答案 0 :(得分:-1)
对于大多数应用程序,您可以通过“ Sticky Sessions”功能使用AWS ELB(经典负载均衡器)。
默认情况下,经典负载均衡器将每个请求独立地路由到负载最小的已注册实例。但是,您可以使用粘性会话功能(也称为会话关联),该功能使负载均衡器可以将用户的会话绑定到特定实例。这样可以确保会话期间来自用户的所有请求都发送到同一实例。
管理粘性会话的关键是确定负载均衡器应将用户的请求持续路由到同一实例的时间。
此外,WebSockets连接本质上是粘性的。如果客户端请求升级到WebSockets的连接,则返回HTTP 101状态代码以接受连接升级的目标是WebSockets连接中使用的目标。 WebSockets升级完成后,将不使用基于cookie的粘性。
有关更多信息,请阅读AWS网站上的以下文档: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html
最终,您可以使用AWS ALB(应用程序负载平衡器),ALB支持Web套接字。
只需用ALB替换ELB并启用粘性会话即可。
应用程序负载平衡器旨在以优化的方式处理流,实时和WebSocket工作负载。它没有缓冲请求和响应,而是以流方式处理它们。这样可以减少延迟并提高应用程序的感知性能。
有关AWS ALB的更多信息,请阅读AWS网站上的以下文档:
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html