为什么在高流量网站中使用Session存储状态是一个糟糕的想法?

21

我正在观看asp.net/learn上的ASP.NET学习视频。在本教程中,他们正在构建一个测验引擎。在其中一部分中,旁白解释说,我们将使用Session对象来维护每个页面之间的状态(每个页面包含一个问题和四个答案)。他说因为"这是一个低流量网站"所以使用Session是可以接受的,而且他没有时间实现更复杂的方法。

我想知道他暗示了哪些替代方法?为什么Session不适合高流量网站?

7个回答

19

将数据存储在数据库中,或者使用Cookie或其他不直接占用Web服务器内存的方法。

除了负载外,会话(session)还会引发跨服务器集群(farm)使用能力的问题,因为您需要同步服务器集群中的会话或使会话保持粘性(sticky),这可能会影响可伸缩性。


我同意,当我们使用会话状态时,最终做的事情是相同的。+1 - John

6

如果您需要替代方案,可以阅读文章Nine Options for Managing Persistent User State in Your ASP.NET Application

在这篇文章中,作者解释了每种方法的优缺点。

从摘要中可以得知:

ASP.NET 提供许多不同的方式来在用户请求之间持续存储数据。你可以使用应用程序对象、cookie、隐藏字段、会话或缓存对象以及许多其他方法。决定何时使用每个方法有时可能很困难。本文将介绍上述技术,并提出一些在何时使用它们的指导方针。尽管这些技术中的许多在经典 ASP 中已存在,但随着 .NET 框架的引入,关于何时使用它们的最佳实践已发生变化。要在 ASP.NET 中保持数据,你需要调整之前在 ASP 中处理状态所学到的内容。


4

会话数据存储在服务器的RAM中,如果您有一个高流量网站,那么数据很快就会被填满,最后你不希望数据被交换到磁盘上。

如gaijin42所说,替代方案是使用cookies或DB。


会话数据默认只存储在内存中,但是您可以将其存储在数据库中。 - Jesper Fyhr Knudsen

4

在高流量系统中,作为状态存储方法的Session有几个问题。

首先,默认的Session存储方法是进程内的,这意味着如果您有一个负载均衡的Web服务器集群,用户从不同的服务器获取页面时,会不断地“丢失”Session信息。

进程内Session服务器也会在应用程序池被回收时死亡,这在高流量服务器上更加频繁发生。

Session数据的可伸缩性选项包括:

  1. 使用免费提供的ASP.NET Session服务器,并将所有应用程序指向它
  2. 使用SQL Server存储Session数据。

由于Session数据的本质,对于非常高的流量站点来说,这两个选项都不是很好的选择(除非您有无限的资金来投入硬件)。


2

对于高流量的网站,您可能需要考虑使用Memcached。它是一种缓存机制,存储在远程计算机的RAM中。最近,该库已经被移植到win32系统上(之前只能在Linux上使用)。


1

我不会重复在这里已经提到的内容,但另一种选择是使用应用哈希。它应该被节约使用,因为它会像Adam已经提到的那样消耗您的Web服务器上的内存,但它确实为缓存所有用户共同使用的东西提供了一个很好的方式。

这可避免您不得不返回数据库以检索很可能已经被其他人请求的信息。

类似于Application的另一种选择是Cache,它在释放时间、持续时间等方面具有更大的灵活性。

如果您感兴趣,以下是一些链接:ASP NET缓存 应用程序状态


1
我们在处理高流量或需要大量会话状态的情况下使用数据库。相反,我们在真实的会话状态中存储一个指针,指向我们的数据库记录。这样,我们只需要处理Web服务器和数据库服务器之间的带宽开销,而这个开销要比任何用户与Web服务器之间的开销小得多。

我很惊讶,网页服务器到数据库被认为是快速的,而网页服务器到客户端被认为是慢速的。你的会话是如何存储在数据库中的? - MedicineMan
1
即使是设计不良的数据库,也很可能会比Web服务器对客户端表现更好,因为在大多数情况下,客户端将通过互联网进行访问,除非您正在进行内部网络应用程序。数据库服务器和Web服务器可能位于同一物理位置,即使不是,它们也可能在专为两者之间快速通信而优化的网络上。我们这样做的另一个原因是允许您的状态跟随您到其他计算机。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接