我正在观看asp.net/learn上的ASP.NET学习视频。在本教程中,他们正在构建一个测验引擎。在其中一部分中,旁白解释说,我们将使用Session对象来维护每个页面之间的状态(每个页面包含一个问题和四个答案)。他说因为"这是一个低流量网站"所以使用Session是可以接受的,而且他没有时间实现更复杂的方法。
我想知道他暗示了哪些替代方法?为什么Session不适合高流量网站?
将数据存储在数据库中,或者使用Cookie或其他不直接占用Web服务器内存的方法。
除了负载外,会话(session)还会引发跨服务器集群(farm)使用能力的问题,因为您需要同步服务器集群中的会话或使会话保持粘性(sticky),这可能会影响可伸缩性。
如果您需要替代方案,可以阅读文章Nine Options for Managing Persistent User State in Your ASP.NET Application。
在这篇文章中,作者解释了每种方法的优缺点。
从摘要中可以得知:
ASP.NET 提供许多不同的方式来在用户请求之间持续存储数据。你可以使用应用程序对象、cookie、隐藏字段、会话或缓存对象以及许多其他方法。决定何时使用每个方法有时可能很困难。本文将介绍上述技术,并提出一些在何时使用它们的指导方针。尽管这些技术中的许多在经典 ASP 中已存在,但随着 .NET 框架的引入,关于何时使用它们的最佳实践已发生变化。要在 ASP.NET 中保持数据,你需要调整之前在 ASP 中处理状态所学到的内容。
会话数据存储在服务器的RAM中,如果您有一个高流量网站,那么数据很快就会被填满,最后你不希望数据被交换到磁盘上。
如gaijin42所说,替代方案是使用cookies或DB。
在高流量系统中,作为状态存储方法的Session有几个问题。
首先,默认的Session存储方法是进程内的,这意味着如果您有一个负载均衡的Web服务器集群,用户从不同的服务器获取页面时,会不断地“丢失”Session信息。
进程内Session服务器也会在应用程序池被回收时死亡,这在高流量服务器上更加频繁发生。
Session数据的可伸缩性选项包括:
由于Session数据的本质,对于非常高的流量站点来说,这两个选项都不是很好的选择(除非您有无限的资金来投入硬件)。
对于高流量的网站,您可能需要考虑使用Memcached。它是一种缓存机制,存储在远程计算机的RAM中。最近,该库已经被移植到win32系统上(之前只能在Linux上使用)。