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