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

Posted

技术标签:

【中文标题】为啥在高流量网站中使用 Session 存储状态是个坏主意?【英文标题】:Why is it a bad idea to use Session to store state in high traffic websites?为什么在高流量网站中使用 Session 存储状态是个坏主意? 【发布时间】:2009-04-20 17:43:17 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

除了负载之外,会话还会引发使用场的能力问题,因为您需要在场中同步会话,或者使会话具有粘性,这会影响可伸缩性。

【讨论】:

我同意,当我们使用会话状态时,我们最终会做同样的事情。 +1【参考方案2】:

有关替代方案,您可以阅读文章Nine Options for Managing Persistent User State in Your ASP.NET Application。

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

摘自:

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

【讨论】:

【参考方案3】:

会话数据存储在服务器的 RAM 中,如果您有一个高流量的网站会很快就满,而您最不希望的是将数据交换到磁盘。

正如 gaijin42 所说,cookie 或 DB 是替代方案。

【讨论】:

会话数据只默认存储在内存中,但您可以将其存储在数据库中。【参考方案4】:

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

首先,默认的 Session 存储方法是进程内的,这意味着如果您有一个负载平衡的网络场,您将不断地“丢失”Session 信息,因为用户从不同的服务器获取页面。

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

Session 数据的可扩展性选项是

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

由于会话数据的一般性质,对于流量非常大的网站来说,这两者都不是一个很好的选择(除非你有无限的钱可以投入到硬件上)。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

如果您有兴趣,这里有一些链接: ASP NET CachingApplication State

【讨论】:

【参考方案7】:

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

【讨论】:

我很惊讶网络服务器到数据库被认为很快,而网络服务器到客户端被认为很慢。您的会话如何存储在数据库中? 即使是设计不佳的数据库也很可能会超过 Web 服务器到客户端的性能,因为在大多数情况下,客户端将通过 Internet,除非您正在使用 Intranet 应用程序。很可能数据库服务器和 Web 服务器将位于相同的物理位置,即使不是,它们也可能位于为两者之间的快速通信而优化的网络上。我们这样做的另一个原因是允许您的状态跟随您到其他计算机。

以上是关于为啥在高流量网站中使用 Session 存储状态是个坏主意?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Asp.net MVC4 不能使用 SQL Server Session 状态存储的 cookieless

在高流量网站中进行规范化或非规范化

JSF 2.0 部分状态保存似乎不起作用

在高流量期间使用 couchdb 进行缓存和可扩展性

为啥我不能将 PHP 类实例存储为 SESSION 变量

session