为什么使用Session在高流量网站中存储状态是个坏主意?

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

我只是想知道他暗示的替代方法是什么? 为什么会话对于高流量网站来说是一个糟糕的选择?

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

除了加载之外,会话还会引发使用服务器场的问题,因为您需要跨服务器场同步会话,或者使会话变粘,这会影响可伸缩性。

有关替代方法,您可以阅读文章“用于管理ASP.NET应用程序中的持久用户状态的九个选项” 。

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

从摘要:

ASP.NET提供了许多不同的方法来在用户请求之间保留数据。 您可以使用Application对象,cookie,隐藏字段,Session或Cache对象以及许多其他方法。 决定何时使用这些中的每一个有时会很困难。 本文将介绍上述技术,并提供何时使用它们的一些指导原则。 尽管经典ASP中存在许多这些技术,但随着.NET Framework的引入,何时使用它们的最佳实践已经发生了变化。 要在ASP.NET中保留数据,您必须调整您之前在ASP中处理状态所学到的知识。

会话数据存储在服务器的RAM中,如果您有一个高流量站点,它将快速完全实现,您最不希望的是数据被交换到磁盘。

正如gaijin42所说,cookies或数据库是另一种选择。

由于多种原因,会话作为状态存储方法在高流量系统中是粗略的。

首先,默认的会话存储方法正在进行中,这意味着如果您有一个负载均衡的Web场,当用户从不同的服务器获取页面时,您将不断“丢失”会话信息。

当应用程序池被回收时,进程内会话服务器也会死亡,这在更高流量的服务器上更常发生。

会话数据的可伸缩性选项是

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

由于会话数据的性质一般而言,对于非常高流量的站点来说,这些都不是一个非常好的选择(除非你有无限的资金投入硬件)。

对于高流量网站,您可能正在查看Memcached。 它是一种缓存机制,存储在远程计算机的RAM中。 就在最近,一个win32端口已经由该库组成(之前只能使用linux)。

我不打算重复这里已经提到的内容,但另一种方法是使用Application哈希。 应该谨慎使用它,因为它会消耗你的Web服务器上的内存,就像Adam已经提到过的那样,但它确实提供了一种很好的方法来缓存所有用户常用的东西。

这使您不必返回数据库以检索很可能已被其他人要求的信息。

类似于Application的另一种替代方案是Cache,它在发布时间,持续时间等方面具有更大的灵活性。

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

我们将数据库用于任何高流量或导致大会话状态的数据库。 相反,我们将指针存储在真实会话状态中,指向我们的数据库记录。 然后我们唯一的开销是Web服务器和数据库服务器之间的带宽,这将比任何给定用户和Web服务器之间的带宽小得多。