4

我已经扫描了 RFC 6265,但没有找到以下问题的答案。

我想在单个 webapp 的多个服务器前面放置一个简单的循环负载均衡器。负载均衡器提供粘性会话。因此,客户端通常会在连续请求时从一个应用服务器反弹到另一个应用服务器。

在第一次连接时,客户端没有 SID,并被随机路由到服务器 A。
服务器 A 以会话 cookie、nonce 响应。

在下一次连接中,客户端将来自服务器 A 的 SID 包含在 HTTP 标头中。这一次,客户端被随机路由到服务器 B。服务器 B 看到(希望!)与它发出的任何 SID 都不匹配的 SID。发生什么了?服务器 B 是否只是忽略“坏”的 SID,或者抱怨,或者忽略请求,还是什么?

这个想法是,我根本不想使用会话 cookie。我想避免粘性的所有复杂性。但我也知道我的服务器可能会生成——而且更重要的是寻找——会话cookie。

我怎样才能确保服务器只是忽略(或更好的是不设置)会话 cookie?

4

1 回答 1

5

我认为这个问题的答案会因服务器上运行的应用程序而有很大差异。尽管任何称职的负载均衡器都有粘性会话,但只要池中的所有服务器都可以通过集中式数据库访问相同的会话状态,就可以在没有它们的情况下进行操作。

由于您在谈论会话 ID,我猜该应用程序确实依赖会话状态才能运行。在这种情况下,如果请求带有“错误”会话 ID,它很可能会被丢弃并提示用户登录——同样,具体行为取决于应用程序。如果您完全禁用会话 cookie,问题可能会变得更糟,因为即使没有 ID 也可能会导致登录提示。

如果您真的想避免负载均衡器的复杂性,您将需要引入一些机制,所有服务器都可以通过该机制处理来自所有会话的请求。通常,这采用集中式数据库或其他一些共享存储的形式。这允许保持会话状态,而不管服务器处理该特定请求。

维护会话状态是负载平衡的症结之一(双关语),但简单地忽略或避免会话 cookie 并不是解决方案。

于 2012-07-30T21:09:39.453 回答