当前位置: 首页 > 知识库问答 >
问题:

基于Cookie的WebSocket负载平衡?

穆劲
2023-03-14

我的情况是,我们目前正在编写一个使用Node的在线应用程序。服务器端的js和WebSocket侦听器。我们有两个不同的部分:一个是服务页面,另一个是使用节点。js和express ejs,另一个是完全不同的应用程序,只包含套接字。用于WebSocket的io库。现在我们来讨论WebSocket部分的可伸缩性问题。

我们发现的一个解决方案是使用redis并在服务器之间共享套接字信息,但由于体系结构的原因,它将需要共享其他信息的负载,这将在服务器上产生巨大的开销。

在这篇介绍之后,我的问题是-是否可以对WebSocket使用基于cookie的负载平衡?因此,假设来自cookie server=server1的用户的每个连接都将始终转发到server1,而来自cookie server=server2的每个连接都将被转发到server2,没有此类cookie的连接将被转发到最忙的服务器。

更新:正如一个“答案”所说——是的,我知道这是存在的。只是不记得那个名字是粘性会话。但问题是——这对WebSocket有效吗?是否有任何可能的并发症?

共有1个答案

诸葛立果
2023-03-14

在我们的Node.js生产堆栈中也出现了类似的问题。我们有两个使用WebSocket的服务器,它们适用于正常的用例,但是负载均衡器偶尔会在两个服务器之间跳转这些连接,这会导致问题。(我们在后端上有会话代码,应该已经修复了它,但没有正确处理它。)

我们尝试在这些服务器前面的Barracuda负载平衡器上启用粘性会话,但发现由于其运行方式,它会阻塞WebSocket流量。我还没有研究确切的原因,因为在线信息很少,但这似乎是由于平衡器如何剥离HTTP请求的头,获取cookie,并将请求转发到正确的后端服务器。由于WebSockets开始时是HTTP,但随后升级,负载平衡器没有注意到连接中的差异,会尝试执行相同的HTTP处理。这将导致WebSocket连接失败,从而断开用户连接。

以下是我们目前所做的工作,工作非常顺利。我们仍然在后端服务器前面使用Barracuda负载平衡器,但是我们没有在负载平衡器上启用粘性会话。在我们的后端服务器上,应用服务器前面是HAProxy,它确实支持WebSocket,并且可以以“迂回”的方式提供粘性会话。

请求流列表

  1. 传入的客户端请求命中主Barracuda负载平衡器
  2. 负载平衡器转发到任一活动后端服务器
  3. HAProxy收到请求并检查新的“粘性饼干”
  4. 基于cookie,HAProxy将转发到正确的后端应用程序服务器

请求流程图

 WebSocket Request  /--> Barracuda 1 -->\   /--> Host 1 -->\   /--> App 1
------------------->                     -->                -->
                    \--> Barracuda 2 -->/   \--> Host 2 -->/   \--> App 1

当箭头返回到一个请求时,这意味着该请求可以流到流中的任一点。

HAProxy配置详细信息

backend app_1
   cookie ha_app_1 insert
   server host1 10.0.0.101:80011 weight 1 maxconn 1024 cookie host_1 check
   server host2 10.0.0.102:80011 weight 1 maxconn 1024 cookie host_2 check

在上述配置中:

  • cookie ha\u app\u 1 insert是实际使用的cookie名称
  • cookie主机\u 1检查cookie主机\u 2检查设置cookie值
 类似资料:
  • 我在一个系统上工作,我用网络套接字向服务器发送消息。为此,我使用具有多个顶点的vertx(没有Rx)Web套接字客户端,消息存储在内部队列中。我希望从消息队列中退出,并提交到具有最少负载的顶点。为了识别负载最少的顶点,我计划使用接收到的消息数量与发送的消息数量的比率。我知道vertx web套接字本质上是异步的。但是有没有规定使用任何提供的处理程序来解析指示消息已经到达服务器的响应。

  • 我在pod中运行了高视频编码任务。这些任务在接收用户请求时运行,并且CPU密集型非常高。我想确保CPU使用率最低的pod应该在传入请求中接收。库伯内特斯有没有办法根据CPU使用率的百分比来平衡我的负载?

  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 我是微服务的新手。(学习阶段)。我有一个问题。我们在云中部署微服务。(例如 AWS)。云已经提供了负载平衡和日志。我们还在Spring Boot中实现了负载平衡(功能区)和日志(Rabbit MQ和Zipkin)。这两种实现有什么区别?我们两者都需要吗?有些人可以回答这些问题吗? 提前感谢。

  • web-service预期会有很多调用,而我希望在出现故障时使该服务成为冗余,因此我希望有两个实例同时运行以处理所有请求。 1)让两个级别的Web服务同时处理请求的最佳方法是什么?使用外部负载均衡器还是使用AKKA/AKKA-HTTP中的某种魔法(我不知道)? 2)我必须调整哪些主要参数来提高性能?

  • 我们面临着 ActiveMQ - M 集合负载平衡的几个问题。有人可以帮忙吗?以下是我们的设置 MCO在故障转移池-Broker1中配置了两个ActiveMQ代理 经纪人1 问题1:MCO客户端在broker1和broker2之间的负载平衡和连接不相等。700 MCO连接到broker1,而只有100 MCO连接至broker2。我们是否缺少此负载平衡的任何属性? 问题 2: 当我们添加新的代理(