Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session

  《Windows Azure Platform 系列文章目录

 

 

  Update 2015-04-06

  笔者对Azure中如何处理Session做了总结,请参考最新的文档:

  Windows Azure HandBook (4) 分析Windows Azure如何处理Session

 

 

 

  Update 2015-03-10

  对于多个Instance保留Session的方法,目前微软官方建议如下:

  1.使用Redis Cache

  2.在PaaS的Cloud Service里,使用In-Role Cache保留Session

  3.将Session保存到SQL Server VM中,并且配置Always-On实现高可用。

 

  另外根据微软官方的文档 http://support.microsoft.com/kb/2006191

  对于Asp.net应用程序来说,微软不支持将Session保存到SQL Azure中

  The workarounds provided here do not work for ASP.Net SQL Session State Management features.   Microsoft does not support SQL Session State Management using SQL Azure databases for ASP.net applications. 

  

   Update 2015-03-10 以下内容已经retired

  传统的ASP.NET应用程序是无状态的,但是我们可以使用Session来保存用户状态,比如保存用户名和密码等等。并且在一般情况下,一些已经部署好的应用程序的逻辑业务很多情况下都是基于Session状态的,而这个Session状态是保存在我们局域网的Web服务器上的。

  如果我们部署单个计算节点(1 instance)的Windows Azure 托管服务,Session就会保存在该托管服务器上。但是这样会遇到一个问题:之前几章我已经提到了,Fabric Controller会自动监控计算节点的的执行状态。如果我们部署的单实例的计算节点遇到了一些问题(比如硬件故障、宕机等),Fabric Controller会自动找寻不同的服务器并且重新启动该计算节点。那就会让我们的托管服务在短时间内无法正常运行和提供服务,可靠性降低了。

  为了提高Windows Azure的可靠性,微软建议一个托管服务至少需要2个instance。这样可以保证某一个计算节点在遇到问题无法提供正常服务的情况下,另外一个计算节点会持续运行并且提供服务。

  假设我们已经把Windows Azure的instance count设置成了2个计算节点(比如A和B),那我们还知道:因为Windows Azure会自动提供负载均衡(Load Balance,LB)的。这样会遇到这样的问题:我们在某一段时间内所有的业务都是由计算节点A来处理的,过了一段时间后A因为去处理比较复杂的计算服务,LB会把我们请求的处理直接交给计算节点B来处理。但是我们保存在A计算节点上的Session状态丢失了!计算节点B不知道之前的Session.

 

所以说,我们如果要把现有的Web应用程序迁移到Windows Azure平台上,对于Session的处理是需要非常注意的。

一.  对于一个计算节点(1 instance)的Windows Azure托管服务,使用现有的"Session[SESSION_NAME_KEY]"可以正常处理业务逻辑。但是因为可能因为计算节点遇到硬件故障等等问题,可靠性降低了。

 

二.  对于两个计算节点以上(2 instance or more)的Windows Azure托管服务,为了保证Session能够持久化,我们需要在现有的Web应用程序上进行修改:

(1)使用Azure Table Storage来保存Session,您可以在这里下载示例代码

你可以通过查找Windows Azure Platform Training kit来下载这个提供程序。在这个工具包中,有一个叫作AspProviders样例项目。你可以直接把这个项目添加到你的解决方案中,也可以使用程序集引用的方式,把那个DLL添加到你的项目中。

如果你引用了这个程序集,那么你必须修改你的web.config文件。打开你的配置文件,然后找到元素。删除现有的配置,然后把下面的代码粘贴上去。当你这么做的时候,记得把你真正的应用程序名写上去。

 

Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
 <!--SessionState Provider Configuration-->
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider">
<providers>
<clear/>
<add name="TableStorageSessionStateProvider"
type ="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"/>
</providers>
</sessionState>
Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session

 

 

-  原理是就是把我们的Session作为对象保存到Windows Azure的Table里,需要的时候再取出继续使用。

优点:  

-  价格相比使用SQL Azure要便宜,Windows Azure Storage每1GB每月只需要0.15美金。

缺点:

-  不能得到微软的官方支持。

-  性能可能不是非常好 (笔者试验了一下,有的时候性能不好)。

-  需要清理之前已经使用过的Session。

 

(2)使用SQL Azure Session Provider来保存Session,具体可以参考MSDN博客

-  原理是就是把我们的Session作为对象保存到SQL Azure的Table里,需要的时候再取出继续使用。

优点:

-  虽然价格比不上使用Table Storage便宜,但是还是可以承受的。

缺点:

-  不能得到微软的官方支持。

-  需要清理之前已经使用过的Session。

每次Session我们会新建一张表来保存Session。对于后续的Session请求,会先查询这张表是否已经存在。所以一旦Session超时,我们就需要删除超时的Session表。为了自动删除过期的Session,我们大部分使用Windows Azure Worker Role来执行删除表的动作。

 

(3)AppFabric Caching

AppFabric Caching实际上是微软推荐的选项并且得到微软官方支持。 AppFabric Caching分布式内存中的缓存服务。它是自动配置的基础上的Windows Server AppFabric Caching。

优点:

-  在内存中缓存,访问速度非常快
-  微软官方支持

缺点:

-  价格相对上面2个方法来说比较高。起始价格是128M 45美金 ,最高是4GB 325美金。

 

 参考资料:Various Options to Manage Session State in Windows Azure

 

 


本文转自Lei Zhang的博客博客园博客,原文链接:http://www.cnblogs.com/threestone/archive/2012/01/30/2332233.html,如需转载请自行联系原作者
上一篇:Zookeeper场景实践:(8) 分布式队列


下一篇:模拟故障场景的 HTTP 代理 toxy_h2non