使用CurrentRoleInstance.Id仅在一个实例中运行任务

Tho*_*iss 8 azure

在一个方面要部署在多个实例Web角色和需要来安排,应该由一个实例来完成只(如发送电子邮件到站点管理员的一些统计数据)一个任务,它有多可靠使用RoleEnvironment.CurrentRoleInstance.Id,以使任务仅在一个实例上运行(如果Id完成时仅运行它IN_0)?如果有人这样做过,我会对他的反馈感兴趣.

Dav*_*gon 10

我不会使用实例ID.如果实例0重新启动(每月至少发生一次)会发生什么?现在您的调度程序或任务运行器处于脱机状态.

另一种解决方案是使用跨越实例的一种互斥体.我想到的是一个blob租约.您实际上可以获取Blob上的租约以进行写入(并且只能有一个租赁持有者).您可以在运行任务之前尝试获取blob租约.如果你得到它,运行任务.如果不这样做,请不要运行它.

稍有不同:在一个线程中(假设从您的Run()方法开始),尝试获取租约,如果成功,则启动调度程序任务(可能是一个线程或其他东西).如果您无法获得租约,请睡一分钟再试一次.最终,带有租约的实例将重新启动(或者由于某些其他原因它将消失).几秒钟后,另一个实例将获取废弃的租约并启动新的调度程序任务.

史蒂夫马克思写了一篇关于使用租约进行并发的博文.Tyler Doerksen也有关于租约的好帖子.


sud*_*u63 6

是的,如果需要,您可以使用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