运行这个简单的例子的时候,你会发现当Web Role中的实例设置成2个以上的时候(目前最大也就2个,ServiceConfiguration.cscfg 文件下<Role name="WebRole">小节下的<Instances count="2" />),你就会发现LocalStorage在多个Tenats中是不共享的,你不断Send新的字符,然后refresh会发现文件的内容是变化/减少的,因为请求可能会被另外一个实例(Tenats)所接收,并保存在一个单独的文件中。
规则1:LocalStorage文件存储不能被多个服务实例/ Tenats共享,不同的服务实例保留自己的一个文件系统实例和存储,彼此之间不共享。 所以LocalStorage不适合保存请求(Request)相关的状态和信息
规则2:LocalStorage文件存储也不能在同一服务的不同角色间进行共享。比如两个Web role之间或是一个Web Role和一个Worker Role之间。
你可以下载到我示范中的代码,我重新设计了一下例子,我增加了一个Worker Role,设想除了在前台界面通过Send的方式增加记录外,还可以通过后台的Worker Role,定期的增加一些记录,这样每次一刷新就可以看见更多的记录了。
当然Worker Role也可以使用LocalStorage,只是配置的位置和上面的Web Role不同,
<LocalStorage name="myLocStorage" />
</WebRole>
<WorkerRole name="Worker" >
<LocalStorage name="myLocStorage" />
</WorkerRole>
在项目中增加Worker Role也非常简单,只用选中你的解决方案,然后右键,像这样
然后在Worker Role项目中增加几乎和Web Role一样的代码,就可以运行了,当运行之后,你会发现在前台界面一刷新,两者的内容又不一致了,通过Worker Role后台日志,你发现Worker Role确实在工作,但是显然它保存到自己的文件中了。
规则3:LocalStorage是非持续(non-persisted)的存储,也就是说当Azure服务/WebRole/Worker Role启动的时候,这个LocalStorage存储才存在,当它们挂起,重新启动后,这些存储会被清空;停止时,这些文件不存在或不可用。
你下载我的例子,也能很快地发现这一点,所以从某种意义上讲,LocalStorage不仅是本地受限的文件存储,而且也是临时性的存储。
牢记LocalStorage的不可共享性和临时性,你就真正能将LocalStorage用得恰到好处。
示范的代码是从Azure Services Training Kit - PDC Preview中摘录出来的进行修改的,也可以单独从我的MSDN代码库下载修改后的这个小项目,在Azure SDK and Tools Jan 2009 CTP环境下测试通过。