【问题标题】:What is the best solution for storing ASP.NET session variables? StateServer or SQLServer?存储 ASP.NET 会话变量的最佳解决方案是什么?状态服务器还是 SQLServer?
【发布时间】:2008-10-22 00:15:12
【问题描述】:
StateServer 还是 SQLServer?
- 存储 ASP.NET 会话变量的最佳解决方案是什么?
- 各有什么优缺点?
- 在任何特定情况下,一个比另一个更好吗?
【问题讨论】:
标签:
asp.net
session
load-balancing
【解决方案1】:
这里有一些关于赞成/反对的想法。
我还添加了 Microsoft Velocity 分布式缓存解决方案。
InProc 的优点
- 可用的最快可选(全部在内存/内存中)
- 易于设置(.config 文件中不需要任何新内容。我认为这是默认行为)。
- 我相信大多数人都使用这个。
InProc 的缺点
- 如果网站(应用程序池)死掉,那么所有会话信息都会丢失。
- 在 WebFarm 场景中不起作用 -> 会话信息仅针对每个应用程序池。
- 不能包含非会话信息。
StateServer 的专业人士
- 在内存/内存中,所以速度很快(但有一些净延迟......请阅读下文),因此它可能不如 Inproc 快。
- Web 场方案的默认配置。多个 iis 站点使用状态服务器来控制状态会话信息。
StateServer 的缺点
- 需要将 ASP.NET StateServer 服务设置为运行。
- StateServer 需要进行一些配置调整才能接受“远程 iis 机器”请求。
- 如果 iis 请求需要在另一台联网计算机上获取/设置会话信息,则存在一些微小的网络延迟。
- 不能包含非会话信息。
用于 SqlServer 的 Pro(作为状态服务器)
- 状态始终保留,即使在 iis 站点重新启动后也是如此。
SqlServer 的缺点(作为状态服务器)
- 最慢的解决方案 -> 净延迟和硬盘延迟(因为 sql 服务器将状态存储在硬盘上/从硬盘读取)。
- 最难设置/配置。
- 不能包含非会话信息
Pro's for Velocity(或其他分布式缓存系统)
- 可以处理的不仅仅是会话信息 -> 对象、应用程序设置、缓存等(这是 IMO 的一件非常好的事情!!)
- 可以是仅内存或持久到数据库。
- 如果一个“节点”发生故障,系统仍然可以工作。 (假设有 2 个以上的缓存节点)
Velocity(或其他分布式缓存系统)的缺点
- 一般花费 $$$
- 最难设置(必须安装东西、调整配置、添加额外的特殊代码)。
- 有网络延迟(通常没有问题),但如果服务正在持久化数据(例如,保存到 Sql Server),则可能有硬盘延迟。
【解决方案2】:
我认为假设您正在使用某种网络农场。
状态服务的一种用途是在 Web Garden 中(同一台机器上的多个工作进程)。在这种情况下,您可以使用负载平衡来保持用户与特定服务器的连接,并让 n 个工作进程共享相同的状态服务。
编辑:在网络花园 + 状态服务或 sql 服务器场景中,您还可以在连接的客户端不丢失会话的情况下回收该机器上的工作进程。
我不熟悉将 SQL Server 用作会话状态存储,但我认为您可以通过在集群中使用 SQL Server 获得稳健性。在这种情况下,您仍然可以拥有多个工作进程和多个服务器,但您不必使用粘性会话(服务器关联)。
还有一点需要注意的是,您可以在第二台机器上使用状态服务,并让场中的所有服务器都访问该机器,但是您会遇到单点故障。
最后,还有第 3 方(和一些本土的)分布式状态服务类应用程序。其中一些比其他选项具有性能优势,而且 Session_End 事件实际上会触发。 (在状态服务和 SQL Server 会话支持中,Global.asax 中的 Session_End 不会触发(可能有一种连接到 SQL Server 的方法)。
【解决方案3】:
在 n 层环境中,使用 SQL Server 托管会话状态,您将为后端创建额外的网络流量,同时丢失一些现在需要处理额外流量(会话相关请求)。 SQL Server 状态管理也比状态服务器慢。
但是,如果您的服务器在某些不可预见的事件中出现故障,SQL Server 很可能会维护会话信息,而不是状态服务器。
【解决方案4】:
根据我的个人经验,我在存储会话变量时遇到了一些问题。我一直丢失会话,我相信这是防病毒软件,当它扫描服务器中的每个文件时,IIS 会重新编译站点以终止会话。 (我必须说我对那台服务器没有任何权力,我被告知在那里托管应用程序)
所以我决定将会话存储在 SQL Server 中,现在每个人都很高兴......它非常快
查看this article 以快速启动
【解决方案5】:
使用单台机器在网络花园中存储状态意味着单点故障。我们使用 SQL 状态,但它确实增加了一些开销。
【解决方案6】:
在 Proc 中非常快。
但有局限性。我们只能使用单个系统。
当系统重新启动时,信息将丢失。
同一台机器上的工作进程
StateServer 将会话信息存储在其他机器中。
Web Farm 可以使用会话。例如:多个工作进程可以从服务器访问会话信息。
当服务器重启时,信息会丢失。
SQLServer 用于将信息存储在 Table 中。默认它将存储在 TempDB 中。
这个 tempdb 会在调用 sqlservice 之后动态调用。
所以这也不会持久化数据。在这个场景中,我们可以使用脚本存储在我们自己的数据库中,这就是所谓的自定义选项。