静态变量如何在Web场中运行?

时间:2012-01-21 00:48:13

标签: c# static static-members

我有一个带静态字典的静态类来跟踪一些统计信息。这种方法在单一和多服务器环境中是否可行?

4 个答案:

答案 0 :(得分:4)

不在多服务器环境中。除非字典不是.Net字典,而是针对数据库或其他外部存储的字典。此外,在单个服务器环境中,您应该记住,每次IIS刷新都会清空字典。

答案 1 :(得分:4)

不,一台服务器内存中的静态变量将不可见或与其他服务器同步。

由于您提到“跟踪统计信息”,许多多实例服务器场最终会做的是将本地收集的数据后处理到所有服务器的活动聚合视图中。每个服务器将内存中的统计信息累积一会儿(几分钟),然后将数据从内存写入本地文件系统上的日志文件。每隔几小时或每天批处理过程将日志文件从服务器场中的每个服务器复制到一个中心位置,并将所有日志记录合并在一起以形成一个数据集合。如果用户的Web请求由同一服务器场中的不同服务器提供服务(负载平衡),则此一个有用的副产品可能是在多个服务器之间整合用户活动。

根据数据量,这种日志数据的批处理本身可能需要相当多的计算能力,多台机器处理服务器日志的不同子集,然后这些中间体再次减少。

Google Sawzall是一个非常大规模的分布式数据处理系统的例子。我相信Sawzall曾(或曾在)用于处理服务器访问日志以检测欺诈性广告点击模式。

答案 2 :(得分:2)

不,它在Web服务器场多服务器环境中不可行。

状态模式选项是:

  • InProc 模式,它将会话状态存储在Web服务器的内存中。 这是默认

  • StateServer 模式,它将会话状态存储在名为ASP.NET状态服务的单独进程中。这可确保在重新启动Web应用程序时保留会话状态,并使会话状态可用于Web场中的多个Web服务器。

  • SQLServer 模式将会话状态存储在SQL Server数据库中。这可确保在重新启动Web应用程序时保留会话状态,并使会话状态可用于Web场中的多个Web服务器。

  • 自定义模式,可让您指定自定义存储提供商。

  • 关闭(禁用会话状态)

答案 3 :(得分:1)

通常情况下,这是您使用应用程序状态的原因。