1

我们有一些服务的集群。客户端通过 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 弹性负载均衡器,我们即将在内部实现这种粘性并绕过 ELB。

在此之前,我正在研究 ALB 是否可以执行我上面描述的操作。找不到任何东西,只是这样:Application Load Balancer 是否支持 WebSockets?这看起来像是一般的连接粘性。在此处查看AWS 文档

如何使用 ALB 进行基于元数据的 WebSocket 粘性?(或者在 AWS 中使用其他东西)。

4

1 回答 1

-1

对于大多数应用程序,您可以通过“粘性会话”功能使用 AWS ELB(经典负载均衡器)。

在此处输入图像描述

默认情况下,Classic Load Balancer 将每个请求独立地路由到负载最小的已注册实例。但是,您可以使用粘性会话功能(也称为会话亲和性),它使负载均衡器能够将用户的会话绑定到特定实例。这可确保会话期间来自用户的所有请求都发送到同一实例。

管理粘性会话的关键是确定您的负载均衡器应将用户的请求始终路由到同一实例的时间。

此外,WebSockets 连接本质上是粘性的。如果客户端请求对 WebSockets 的连接升级,则返回 HTTP 101 状态码以接受连接升级的目标是 WebSockets 连接中使用的目标。WebSockets 升级完成后,不再使用基于 cookie 的粘性。

有关更多信息,请阅读 AWS 网站上的以下文档: https ://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html

最终,您可以使用 AWS ALB(应用程序负载均衡器),ALB 支持 Web Sockets。

只需将 ELB 替换为 ALB 并启用粘性会话。

Application Load Balancer 旨在以优化的方式处理流式传输、实时和 WebSocket 工作负载。它不是缓冲请求和响应,而是以流方式处理它们。这可以减少延迟并提高应用程序的感知性能。

有关 AWS ALB 的更多信息,请阅读 AWS 网站上的以下文档:

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html

于 2018-10-10T16:07:09.377 回答