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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

  《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文件。打开你的配置文件,然后找到元素。删除现有的配置,然后把下面的代码粘贴上去。当你这么做的时候,记得把你真正的应用程序名写上去。

 

复制代码
 <!--SessionState Provider Configuration-->
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider">
<providers>
<clear/>
<add name="TableStorageSessionStateProvider"
type ="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"/>
</providers>
</sessionState>
复制代码

 

 

-  原理是就是把我们的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,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
API
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
|
19天前
|
安全 网络安全 数据安全/隐私保护
【Azure Developer】System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
|
27天前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
80 9
|
30天前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
33 1
|
3月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
3月前
|
存储 API 开发工具
【Azure Storage Blob】如何通过.NET Azure Storage Blobs SDK获取到Blob的MD5值呢?
【Azure Storage Blob】如何通过.NET Azure Storage Blobs SDK获取到Blob的MD5值呢?
|
3月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
3月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
3月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
3月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)