22

首先给大家介绍一下当前环境的背景。我们有许多 ASP.NET 应用程序,所有这些应用程序都在某些方面使用会话。由于流量级别,我们在多个服务器上进行了“负载平衡”,但是,我们的负载平衡设置为使用“粘性会话”,因为当前所有 Web 应用程序都设置为使用“InProc”作为会话状态。

我们正在考虑能够删除负载均衡器上的“粘性会话”配置,因为由于我们的流量负载,服务器可能而且确实会超载。我们希望采用更平衡的方法,但必须能够使用会话。

我知道用于会话状态的 SqlServer 可以工作,但是由于我们无法控制的原因,我们不能使用 SqlServer 来存储我们的状态。在研究中,StateServer 似乎是我们最好的选择。我们有一个额外的服务器,周围有大量的内存。这个服务器可以是我们整个 Web 集群的 StateServer。我们只想知道以下几点。

1.) 除了从 InProc 切换到 StateServer 的任何潜在的序列化问题之外,是否存在与上述环境丢失会话对象或生成错误有关的任何重大已知问题?

2.) 除了单点故障和稍慢的性能外,我们在使用 StateServer 时还需要注意其他任何问题。

3.) 是否有任何指标可以显示三种状态存储之间的性能差异?

4

6 回答 6

23

这是关于 asp.net 状态的一个不错的常见问题解答:http ://www.eggheadcafe.com/articles/20021016.asp

从那篇文章中,这里有一些关于 StateServer 的信息:

  • 在网络场中,确保所有网络服务器中的 MachineKey 都相同。请参阅KB 313091了解如何操作。
  • 另外,请确保您的对象是可序列化的。有关详细信息,请参阅KB 312112
  • 为了在 Web 场中的不同 Web 服务器之间维护会话状态,IIS 元数据库中网站的应用程序路径(例如 \LM\W3SVC\2)在 Web 场中的所有 Web 服务器中应该相同。有关详细信息,请参阅KB 325056
于 2009-03-26T19:15:12.257 回答
3

我只使用过sql和in-proc。但是使用 sql server 时适用的这 3 个也适用:

  • 避免在会话中存储太多信息,因为它会影响序列化和通过网络传输的数据。
  • 确保您没有任何依赖于 Session_onEnd 的内容。这不适用于进程外会话。
  • 关闭不使用它的页面上的会话。这对进程内会话没有影响,但对于进程外它会为您节省很多。
于 2009-03-26T19:56:21.427 回答
2

确保您的服务器 etag id 在整个网络场中同步,否则客户端浏览器的缓存将被打乱。

您是否仔细检查了您的代码,以确保所有内容都可以在进程外有效地通过 LAN 进行序列化?

您是否正在解决系统中的主要性能问题?我问是因为数据库是典型的争用源。

我摆脱粘性会话的主要动机是操作灵活性,即关闭有问题的服务器或部署软件升级。因此,实施中央会话状态服务后,请确保您从操作的角度充分利用。

于 2009-03-26T19:57:06.090 回答
2

根据我的经验,我们发现本机状态服务器甚至使用 SQL Server 进行会话是一个非常可怕的场景,因为两者都有问题(主要是性能)。顺便说一句,我们也在使用粘性会话。

我认为您可以为此探索其他产品以达到绝对最佳效果。一个免费的选项是Velocity,但它仍然没有发布。另一个全面但经过验证的产品将是(实际上非​​常昂贵)NCache。这甚至会以更低的成本帮助您进行序列化,如果您使用他们的 API,它将获得更好的结果。

看看哪个最适合您。

关于 SQL Server,如果你有足够数量的点击量,你的服务器很快就会死掉(我相信你已经有一些点击量让你做 Web Farm 或者你只是为了冗余而这样做)

底线:我们正在评估 Velocity,因为 NCAchce 非常昂贵。不过优势是巨大的。

于 2009-04-02T05:57:08.627 回答
0

我们将 StateServer 用于一个非常小的网络场,只有两个节点可供数百名用户使用。

我不负责它的运行,但我记得两年内只有两个问题因为服务崩溃而不得不重新启动。

于 2009-03-26T19:08:17.470 回答
0

我想再强调一点接受的答案:

  • 确保框架 dll 的版本相同。

在我的情况下,System.Web dll 版本不同,因为在场的一台服务器上跳过了一些 Windows 更新。

于 2013-04-09T08:46:37.827 回答