存储ASP.NET会话变量的最佳解决方案是什么? StateServer还是SQLServer?

时间:2008-10-22 00:15:12

标签: asp.net session load-balancing

StateServer或SQLServer?

  • 存储ASP.NET会话变量的最佳解决方案是什么?
  • 各自的优点和缺点是什么?
  • 在任何特定情况下,一个人比其他人好吗?

6 个答案:

答案 0 :(得分:11)

以下是关于亲/骗局的一些想法。 我还添加了Microsoft Velocity Distributed Caching解决方案。

InProc的优点

  • 最快的可选项(全部内存/内存)
  • 易于设置(.config文件中不需要任何新内容..我认为这是默认行为。)
  • 我认为大多数人都会使用此功能。

InProc的缺点

  • 如果网站(应用程序池)死亡,则所有会话信息都将丢失。
  • 在WebFarm场景中不起作用 - >会话信息仅适用于每个应用程序池。
  • 不能包含非会话信息。

Pro的StateServer

  • 在内存/内存中,所以速度很快(但有一些净延迟......请参阅下文),因此可能没有Inproc快。
  • Web场方案的默认配置。多个iis站点使用状态服务器来控制状态会话信息。

ConServer for StateServer

  • 需要将ASP.NET StateServer服务设置为运行。
  • StateServer需要一些配置调整来接受'远程iis机器'请求。
  • 如果iis请求需要在另一台联网计算机上获取/设置会话信息,则会有一些微小的网络延迟。
  • 不能包含非会话信息。

Pro for SqlServer(作为状态服务器)

  • 即使在iis站点重新启动后,也始终保留状态。

SqlServer的Con(作为状态服务器)

  • 最慢的解决方案 - >净延迟和硬盘延迟(因为sql server将状态存储在硬盘上/从硬盘读取)。
  • 最难设置/配置。
  • 不能包含非会话信息

Pro for Velocity(或其他分布式缓存系统)

  • 可以处理的不仅仅是会话信息 - >对象,应用程序设置,缓存等(这是一个非常好的东西IMO !!)
  • 只能是内存或持久存储到数据库。
  • 如果一个“节点”发生故障,系统仍然有效。 (假设有2个以上的缓存节点)

用于速度的Con(或其他分布式缓存系统)

  • 一般费用$$$
  • 最难设置(必须安装内容,调整配置,添加额外的specal代码)。
  • 具有网络延迟(通常没有),但如果服务持久化数据(例如,到Sql Server),可能会有硬盘延迟。

答案 1 :(得分:3)

我认为假设你正在使用某种类型的网络农场。

状态服务的一种用途是在Web Garden中(同一台机器上有多个工作进程)。在这种情况下,您可以使用负载平衡来保持用户与特定服务器的连接,并让n个工作进程共享同一个状态服务。

编辑:在Web园+状态服务或SQL服务器方案中,您还可以在连接的客户端丢失其会话时回收该计算机上的工作进程。

我对使用SQL Server作为会话状态存储并不熟悉,但我认为通过在群集中使用SQL Server可以获得健壮性。在这种情况下,您仍然可以拥有多个工作进程和多个服务器,但您不必使用粘性会话(服务器亲缘关系)。

还有一点需要注意,您可以在第二台计算机上使用状态服务,并让服务器场中的所有服务器都能访问该计算机,但您会遇到单点故障。

最后,还有第三方(和一些本土的)分布式状态服务类应用程序。其中一些比其他选项具有性能优势,而且Session_End事件实际上会触发。 (在State Service和SQL Server会话支持中,Global.asax中的Session_End不会触发(可能有一种挂钩到SQL Server的方式))。

答案 2 :(得分:1)

在n层环境中,使用SQL Server托管会话状态,您将为后端创建额外的网络流量,以及丢失一些现在需要处理额外流量的SQL Server资源(会话)相关的要求)。 SQL Server状态管理也比状态服务器慢。

但是,如果您的服务器因某些无法预料的事件而中断,SQL Server很可能会维护会话信息,而不是状态服务器。

答案 3 :(得分:0)

根据我的个人经验,我在会话变量中存储了一些问题。我一直在失去会话,我相信它是反病毒,因为它扫描服务器中的每个文件,IIS会重新编译该站点杀死会话。 (我必须说我对该服务器没有权力,我被告知要在那里托管应用程序)
所以我决定将会话存储在SQL Server中,现在每个人都很高兴......这是非常快的

快速了解this article

答案 4 :(得分:0)

使用单台机器在Web园中存储状态意味着单点故障。我们使用SQL状态,但它确实增加了一些开销。

答案 5 :(得分:0)

在Proc中非常快。 但有限制。我们只能使用单一系统。 当重启系统时,信息将丢失。 工人在同一台机器上处理

StateServer将会话信息存储在其他计算机中。 Web Farm可以使用该会话。例如:多个工作进程可以从服务器访问会话信息。 当重启服务器时,信息将丢失。

SQLServer用于在表中存储信息。默认它将存储在TempDB中。 调用sqlservice后,此tempdb将动态调用。 所以这也不会持久化数据。在这个场景中,我们可以使用脚本存储在我们自己的数据库中,称为自定义选项。