将 HTTP 连接路由到负载均衡器后面的许多实例中的一个特定实例有哪些选择?

What are the options of routing HTTP connections to one specific instance out of many instances behind a load balancer?

假设有一个系统接受来自客户端应用程序的数百万个并发 WebSocket 连接。我想知道如果客户端提供某种形式的元数据,例如哈希键、实例名称等,是否有一种方法可以将 WebSocket 连接路由到负载均衡器(或 IP/Domain/etc)后面的特定实例

例如,假设上述系统的每个 WebSocket 客户端始终属于一个组(例如最大组大小为 100),并且它将尝试使用上述系统作为消息网关与 99 个其他客户端通信.

所以系统的职责是将群组中的客户端发送的消息中继到同一群组中的其他 99 个客户端。客户端永远不需要与属于不同组的其他客户端进行通信。

当然,解决这个问题的一种方法是使用Pubsub系统,这样无论客户端连接到哪个实例,服务器都可以简单地将消息发布到带有组标识符的Pubsub系统,其他客户端可以使用组标识符订阅消息。

但是,Pubsub 系统可能会遇到扩展挑战、资源使用过多(单条消息发布到数千个实例)、管理开销、延迟增加、成本等问题

如果可以保证一个组内的WebSocket客户端都连接到LB后面的实例,我们可以跳过使用Pubsub系统,更简单,降低延迟等

这是可行的吗?如果不行,最好的选择是什么?

(如果重要的话,我在其中一个云服务提供商中使用 Kubernetes。)

HTTP 中的路由通常基于主机名and/or URL 路径。有时在其他 headers 上的程度较低,例如 cookie。但在这种情况下,这意味着每个组都应该有自己独特的 URL.

但这部分很简单,我认为您真正要问的是“给定任意 URLs,我如何才能获得一致的路由?”这要复杂得多。基本概念是“一致性哈希”,您对 URL 进行哈希处理并使用它来选择要与之通信的端点。但是如何在不完全打乱映射的情况下处理添加或删除副本。这通常意味着使用哈希环并将哈希的一部分 space 分配给特定的副本。不幸的是,这是 off-the-shelf 工具还不够的地方。这些类型的系统需要深入了解您的协议和系统细节,因此您可能需要自己组装。