代码之家  ›  专栏  ›  技术社区  ›  MedicineMan

为什么在高流量的网站上使用会话来存储状态是一个坏主意?

  •  20
  • MedicineMan  · 技术社区  · 15 年前

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

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

    7 回复  |  直到 15 年前
        1
  •  19
  •   Jason Coyne    15 年前

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

    除了加载之外,会话还提出了使用服务器场的能力问题,因为您要么需要在服务器场之间同步会话,要么使会话具有粘性,这可能会影响可伸缩性。

        2
  •  6
  •   eKek0    15 年前

    对于备选方案,您可以阅读本文 Nine Options for Managing Persistent User State in Your ASP.NET Application .

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

    总结如下:

    ASP.NET提供了许多不同的方法 在用户请求之间保留数据。 您可以使用应用程序对象, cookie、隐藏字段、会话或 缓存对象和许多其他对象 方法。决定何时使用 这些有时是困难的。这个 文章将介绍 上述技术及现状 关于何时使用它们的一些指导原则。 尽管这些技术很多 存在于经典ASP中,最佳实践 因为什么时候使用它们 .NET的介绍 框架。要在ASP.NET中持久化数据, 你必须调整你学到的东西 以前关于处理状态 ASP.

        3
  •  4
  •   Adam Pope    15 年前

    会话数据存储在服务器的RAM中,如果您有一个流量很高的站点,它将非常快地完全填满,而您最不想要的就是将数据交换到磁盘上。

    正如Gaijin42所说,曲奇或数据库是另一种选择。

        4
  •  4
  •   Harper Shelby damiankolasa    15 年前

    会话作为一种状态存储方法在高流量系统中很难实现,原因有几个。

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

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

    会话数据的可伸缩性选项包括

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

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

        5
  •  2
  •   Erick    15 年前

    对于高流量的网站,您可能会看到memcached。它是一种缓存机制,存储在远程计算机的RAM中。就在最近,一个win32端口被建立在这个库中(以前只有linux才有可能)。

        6
  •  1
  •   Joseph    15 年前

    我不会重复这里已经提到的内容,但另一种选择是使用应用程序哈希。应该谨慎地使用它,因为它会像亚当已经提到的那样消耗Web服务器上的内存,但是它确实提供了一种好的方法来缓存在所有用户中常见的东西。

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

    另一个类似于应用程序的选择是缓存,它在释放时间、持续时间等方面具有更大的灵活性。

    以下是一些链接,以防您感兴趣: ASP NET Caching Application State

        7
  •  1
  •   John    15 年前

    我们将数据库用于任何高流量或将导致大会话状态的情况。相反,我们在实际的sessionstate中存储一个指向数据库记录的指针。那么,我们唯一的开销就是Web服务器和数据库服务器之间的带宽,这将远远小于任何给定用户和Web服务器之间的带宽。