不能完全无状态的大型网站如何在 Web 层实现极高的可扩展性?
像 eBay 和 Amazon 这样的网站不能完全无国籍,因为它们有购物车或类似的东西。将购物车中的每件商品编码到 URL 中是不可行的,将每件商品编码到 cookie 中并在每次连接时发送也不可行。所以亚马逊只是将会话 ID 存储到正在发送的 cookie 中。所以我知道 eBay 和 Amazon 的 web 层的可扩展性应该比 google 搜索引擎的可扩展性要困难得多,在那里一切都可以被编码到 URL 中。
另一方面,eBay 和亚马逊的规模都非常大。有传言说 eBay 上有大约 15000 个 J2EE 应用服务器。
这些站点如何处理这两者:极端的可扩展性和有状态?由于站点是有状态的,因此进行简单的 DNS 平衡是不可行的。所以人们会假设这些公司有一个基于硬件的负载均衡器,比如 BigIP、Netscaler 或类似的东西,这是该站点的单个 IP 地址背后的唯一设备。此负载均衡器将解密 SSL(如果已编码)、检查 cookie 并根据该 cookie 的会话 id 决定哪个应用程序服务器持有该客户的会话。
但这不可能工作,因为没有单个负载均衡器可以处理数千个应用程序服务器的负载?我想即使是这些硬件负载平衡器也无法扩展到这样的水平。
此外,负载平衡正在为用户透明地完成,即用户不会被转发到不同的地址,但仍然全部集中在 www.amazon.com 上。
所以我的问题是:是否有一些特殊的技巧可以实现网络层的透明分片(而不是通常所做的数据库层)?只要不检查 cookie,就无法知道哪个应用程序服务器正在持有此会话。
编辑:我意识到只需要透明度,如果需要对网站进行爬虫和书签。例如,如果该站点只是一个 Web 应用程序,例如飞机或火车票预订系统,那么将用户重定向到不同 URL 后面的特定 Web 服务器集群应该没有问题,例如 a17.ticketreservation.com。在这种特定情况下,只使用多个应用程序服务器集群是可行的,每个集群都位于自己的负载均衡器后面。有趣的是,我没有找到使用这种概念的网站。 编辑:我发现这个概念在highscalability.com上讨论过,讨论指的是 Lei Zhu 的一篇名为“Web 2.0 应用程序的客户端负载平衡”。Lei Zhu 使用交叉脚本来透明地进行客户端负载平衡。
即使有一些缺点,如书签、xss 等,我确实认为这对于某些特殊情况听起来是一个非常好的主意,即几乎没有内容的 Web 应用程序,不需要被蜘蛛或书签(例如机票预订系统或类似的东西)。那么就不需要透明地进行负载平衡了。
可能存在从主站点到服务器的简单重定向,例如从 www.ticketreservation.com 到 a17.ticketreservation.com 的重定向。从那里用户停留在服务器 a17。a17 不是服务器,而是集群本身,通过它可以实现冗余。
初始重定向服务器本身可以是负载平衡器后面的集群。这样,可以实现非常高的可扩展性,因为 www 后面的主要负载均衡器只在每个会话开始时被命中一次。
当然,重定向到不同的 url 看起来非常讨厌,但是对于单纯的 Web 应用程序(无论如何都不需要蜘蛛、深度链接或深度书签),这对用户来说应该只是一个视觉问题吗?
重定向集群可以轮询应用集群的负载并相应地调整重定向,从而实现平衡而不仅仅是负载分配。