8

状态服务器还是 SQLServer?

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

6 回答 6

11

这里有一些关于赞成/反对的想法。我还添加了 Microsoft Velocity 分布式缓存解决方案。

InProc 的优点

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

InProc 的缺点

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

用于 StateServer 的 Pro

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

StateServer 的缺点

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

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

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

Con's for SqlServer(作为状态服务器)

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

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

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

Con's for Velocity(或其他分布式缓存系统)

  • 一般花费$$$
  • 最难设置(必须安装东西,调整配置,添加额外的特殊代码)。
  • 有网络延迟(通常没什么),但如果服务正在持久化数据(例如,到 Sql Server),则可能有硬盘延迟。
于 2009-04-19T08:12:31.057 回答
3

我认为假设您正在使用某种网络农场。

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

编辑:在网络花园 + 状态服务或 sql 服务器场景中,您还可以在没有连接的客户端丢失会话的情况下回收该机器上的工作进程。

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

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

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

于 2008-10-22T00:56:16.337 回答
1

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

但是,如果您的服务器在某些不可预见的事件中出现故障,SQL Server 很可能会维护会话信息,而不是状态服务器。

于 2008-10-22T02:41:54.580 回答
0

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

查看这篇文章以快速启动

于 2008-10-22T02:51:37.867 回答
0

Using a single machine to store state in a web garden means a single point of failure. We use SQL state, but it does add a bit of overhead.

于 2008-10-22T11:23:45.803 回答
0

在 Proc 中非常快。但有局限性。我们只能使用单个系统。当系统重新启动时,信息将丢失。同一台机器上的工作进程

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

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

于 2009-02-09T10:33:32.283 回答