2014-06-17 60 views
0

我们目前拥有的系统每天有超过200,000个独特的会话请求,因此我们引入了一个带负载平衡器的新服务器来处理负载。这是问题出现的地方,因为我们的sessionstate =“InProcess”。一旦用户启动应用程序,我们会在Session中加载一些重要的变量,因为这些变量在整个应用程序中都会使用,而不是在每个页面触击数据库,因此我们将它们存储在Session Object中。哪种方法可行,但是通过这种方式,我们必须确保应用程序池不会回收,但每天一次,并且在停机时间内,服务器内存会在一天中变得很大。请记住,该系统是从系统A启动的,因此如果这些主要值丢失,那么系统A必须重新打开该应用程序。解决方案1:使用会话对象替换以将变量存储到应用程序缓存(但缓存这将能够保留他们的价值在应用程序池回收期间).Net设计架构可扩展

解决方案2:每个页面为这些值命中SQL服务器数据库(但我认为这不会很好地扩展以持续打开和关闭连接以获取我可以维护的信息在应用程序中)

解决方案3:更新会话对象用于序列化并添加混合中的StateServer以处理保留的会话d使用App Pool回收和跨两台服务器(但不会降低性能)。

解决方案4:通过使用隐藏控件将这些值保存到代码的客户端,并将这些值在每次命中时发送到服务器。这些属性不是敏感信息,所以这不应该是一个问题

回答

1

解决方案1:如果您使用内置的.NET缓存,它不会在应用程序池回收中幸存下来。解决方案2:我不会建议您可以编写自己的会话存储提供程序并使用任何键值存储(例如文件系统或可能是某个文档数据库)。但你事实上编写你自己的状态服务器。

解决方案3:状态服务器适用于少量实例。它也相当快,所以我更喜欢它。解决方案4:如果信息很大,要存储在一个cookie中(我认为有4kB的限制),您可以使用隐藏的表单字段,但这不是一个优雅的解决方案。只有当我们谈论你需要坚持的几个变量时它才可用。

我不知道应用程序,但是大多数情况下我会选择状态服务器。