在一个方面要部署在多个实例Web角色和需要来安排,应该由一个实例来完成只(如发送电子邮件到站点管理员的一些统计数据)一个任务,它有多可靠使用RoleEnvironment.CurrentRoleInstance.Id,以使任务仅在一个实例上运行(如果Id完成时仅运行它IN_0)?如果有人这样做过,我会对他的反馈感兴趣.
Dav*_*gon 10
我不会使用实例ID.如果实例0重新启动(每月至少发生一次)会发生什么?现在您的调度程序或任务运行器处于脱机状态.
另一种解决方案是使用跨越实例的一种互斥体.我想到的是一个blob租约.您实际上可以获取Blob上的租约以进行写入(并且只能有一个租赁持有者).您可以在运行任务之前尝试获取blob租约.如果你得到它,运行任务.如果不这样做,请不要运行它.
稍有不同:在一个线程中(假设从您的Run()方法开始),尝试获取租约,如果成功,则启动调度程序任务(可能是一个线程或其他东西).如果您无法获得租约,请睡一分钟再试一次.最终,带有租约的实例将重新启动(或者由于某些其他原因它将消失).几秒钟后,另一个实例将获取废弃的租约并启动新的调度程序任务.
史蒂夫马克思写了一篇关于使用租约进行并发的博文.Tyler Doerksen也有关于租约的好帖子.
是的,如果需要,您可以使用InstanceId
<Startup>
<Task commandLine="StartUpTasks\WindowService\InstallWindowService.bat" executionContext="elevated" taskType="background" >
<Environment>
<Variable name="InstanceId">
<RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/>
</Variable>
</Environment>
</Task>
</Startup>
Run Code Online (Sandbox Code Playgroud)
它将是以下形式
<deployment Id>.<Application Name>.<Role Name>_IN_<index>
Example mostly MyRole_IN_0, MyRole_IN_1
Run Code Online (Sandbox Code Playgroud)
像这样在批处理文件中访问environmet变量
%InstanceId%
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用_的子字符串或最后一个索引来从InstanceId获取索引.如果具有索引0的此实例即使在重新启动后也将具有相同的索引.
更多详情 http://blogs.msdn.com/b/cclayton/archive/2012/05/17/windows-azure-start-up-tasks-part-2.aspx
http://msdn.microsoft.com/en-us/library/windowsazure/hh404006.aspx
| 归档时间: |
|
| 查看次数: |
2846 次 |
| 最近记录: |