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

Azure 使用CurrentRoleInstance.Id仅在一个实例中运行任务,azure,Azure,如果您要在多个实例上部署web角色,并且需要计划一个只应由一个实例完成的任务(如向站点管理员发送带有某些统计信息的电子邮件),那么使用RoleEnvironment.CurrentRoleInstance.Id使任务只在一个实例上运行,可靠性有多高(如仅当Id在_0中以结束时才运行它)? 如果有人曾经这样做过,我会对他的反馈感兴趣。如果您有多个实例,可以让某些执行代码块只运行一次,例如检查您正在执行的当前角色实例的ID 您可以使用其他解决方案获得相同的结果,但这些解决方案可能需要更多的工作,例如

如果您要在多个实例上部署web角色,并且需要计划一个只应由一个实例完成的任务(如向站点管理员发送带有某些统计信息的电子邮件),那么使用
RoleEnvironment.CurrentRoleInstance.Id
使任务只在一个实例上运行,可靠性有多高(如仅当Id在_0中以
结束时才运行它)?

如果有人曾经这样做过,我会对他的反馈感兴趣。

如果您有多个实例,可以让某些执行代码块只运行一次,例如检查您正在执行的当前角色实例的ID


您可以使用其他解决方案获得相同的结果,但这些解决方案可能需要更多的工作,例如将任务与实例解耦。我不会使用实例ID。如果实例0重新启动(每月至少发生一次),会发生什么情况?现在,您的计划程序或任务运行程序处于脱机状态

另一种解决方案是使用一种跨实例的互斥体。我想到的是blob租约。实际上,您可以获取blob租约以供写入(并且只能有一个租约持有人)。您可以在运行任务之前尝试获取blob租约。如果获得了,请运行任务。如果没有,请不要运行它

一个微小的变化:在一个线程中(比如从
Run()
方法开始),尝试获取租约,如果成功,则启动一个调度程序任务(可能是一个线程或其他任务)。如果无法获取租约,请休眠一分钟,然后重试。最终,具有租约的实例将重新启动几秒钟后,另一个实例将获取放弃的租约并启动一个新的调度程序任务


Steve Marx写了一篇关于使用租约的并发性的文章。Tyler Doerken也写了一篇关于租约的文章。

是的,如果需要,您可以使用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>
然后可以使用子字符串或最后一个u索引从InstanceId获取索引。 如果此实例具有索引0,则即使在重新启动后也将具有相同的索引

更多细节


谢谢你的回复,我已经浏览了smarx的博客文章。不过,我还是不完全理解你关于实例重新启动的观点。在重新启动后,它仍然会有相同的实例ID,对吗?如果是这样,就有可能在任务应该运行的时候重新启动(例如,在重新启动后运行)。我的观点是,您总是希望计划程序运行。如果您依赖于特定实例,则保证会有停机时间。另外:如果您缩小规模,会发生什么情况?您无法指定要删除的实例。如果删除的实例是您一直引用的实例,会发生什么情况?是的。我将实现blob lease选项。谢谢。
<deployment Id>.<Application Name>.<Role Name>_IN_<index>
 Example mostly MyRole_IN_0, MyRole_IN_1
 %InstanceId%