负载均衡器粘性会话和非常旧的 Web 服务
Posted
技术标签:
【中文标题】负载均衡器粘性会话和非常旧的 Web 服务【英文标题】:Load Balancer sticky sessions and very old webservices 【发布时间】:2018-03-20 20:09:02 【问题描述】:使用硬件 LoadBalancer,您可以配置粘性会话,以确保同一会话始终转到同一台服务器。
但这是否也适用于网络服务(而不是网络服务器)?
即我在负载均衡器后面托管了 Web 服务。
来自不同本地客户端(不是浏览器客户端)的 Web 服务调用是否总是会转到同一个 Web 服务服务器?
这些是非常老式的 Web 服务 - 使用 RPC/编码 - 本机客户端程序使用 Axis 1.4 作为客户端存根。
【问题讨论】:
【参考方案1】:如果您可以让您的应用程序保持无状态,那么让它在性能和可扩展性方面都很好。
无国籍的好处:
可扩展性。您可以拥有任意数量的服务器,而无需共享用户会话。他们每个人都可以处理请求(例如通过循环进行负载平衡)。
节省服务器资源。我们不需要在服务器端分配内存(同样——可扩展性)。
服务器重启后无需恢复。
会话粘性很难正确处理。例如,如果您的 Web 服务器在多核机器上运行,并且您有多个处理 Web 流量的进程,那么您将需要一种方法来粘住特定机器和该机器上的单个进程。因此,请确保您的系统在粘性无法正常工作的情况下能够很好地降级。
你可以在这里找到很好的讨论:Sticky and NON-Sticky sessions
粘性会话的优缺点: Pros and Cons of Sticky Session / Session Affinity load blancing strategy?
现在来回答你的问题:
Webservice 调用是否来自不同的本地客户端(不是 浏览器客户端)总是去同一个网络服务服务器?
在粘性会话中是。
这些是非常老式的 Web 服务 - 使用 RPC/Encoding - 本机 客户端程序使用 Axis 1.4 作为客户端存根。
您需要负载均衡器/服务器的会话配置,它可以处理任何新旧类型的应用程序
这也适用于网络服务(而不是网络服务器)?
您无需在服务器级别进行配置。
【讨论】:
这根本不能回答我的问题。 它是否适用于 webserver-browser 客户端类型的程序以及本机客户端-webservice 类型的程序?Session configuration you need load balancer
- 这是什么意思?
您需要负载均衡器来配置您的路由,并且在 Web 服务代码级别您不能配置粘性 vs 循环
如前所述,有一个负载均衡器并在其中配置了粘性会话。我的问题是负载均衡器如何知道 Web 服务调用的会话?我可以理解负载均衡器计算网络服务器调用的会话,但它如何计算网络服务调用中的会话?【参考方案2】:
只要您的本地客户端正确管理会话,它就会工作,即。为每个请求设置正确的 http 标头。
通常粘性会话由负载均衡器通过修改会话 cookie 以添加服务器身份来管理。
HA-proxy example
您的负载均衡器必须有专门的文档。
【讨论】:
什么会话cookie?如问题中所述,我不是在谈论由负载平衡器平衡的网站-它是一种网络服务。您提供的链接根本没有谈论网络服务 设置会话头。 Web 服务使用与其他请求相同的通道 (http)。会话通常由浏览器使用 cookie 管理,在您的情况下,如果您的客户端(即轴)不处理它,您可能必须自己设置标题。【参考方案3】:来自不同本地客户端(不是浏览器客户端)的 Web 服务调用总是会转到同一个 Web 服务服务器。
为了保持会话粘性,主要是负载平衡在响应客户端时在 cookie 中注入服务器标识符(请注意 cookie 不是浏览器功能,它是由this specification 定义的 HTTP 功能)并且应该由 HTTP 支持Axis 1.4 下面使用的客户端)。
我建议您分析负载平衡的工作原理,并在此基础上更改您的需求以更改您的客户端。如果您的负载平衡使用基于 cookie 的方法,this answer 您可能会发现它很有用。
希望这会有所帮助。
【讨论】:
以上是关于负载均衡器粘性会话和非常旧的 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 TCP 负载均衡器代理 WebSockets 而没有粘性会话
负载均衡器 cookie 粘性和用于存储用户会话的 ElastiCache 有啥区别?