我们有两个使用TimerTrigger运行的Azure Webjob部署(产品和测试)。这两个Web应用程序都具有单个实例。根据本文的介绍,TimeTriggers使用单例锁来确保没有并行调用。这两个实例使用相同的存储帐户。我们面临的问题是,只有一个部署似乎获得了锁定,而其他部署却无法获得该锁定。如果我们停止第一个Web作业,第二个Web作业将获得锁定并开始处理,反之亦然。
锁定是否取决于存储帐户?我们如何确保这两个部署具有单独的锁定机制并同时运行?
没错,您必须使用其他存储帐户。
从文档中:
在后台,TimerTrigger使用WebJobs SDK的Singleton功能来确保在任何给定时间仅运行触发函数的单个实例。当JobHost启动时,对于您的每个TimerTrigger函数,都会使用Blob租约(单例锁)。这种分布的锁确保了您的调度函数在任何时候都只在运行一个实例。如果当前未租用该函数的Blob,则该函数将获取租约并立即按计划开始运行。如果无法获取Blob租约,则通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动。发生这种情况时,主机将继续定期检查以查看其是否可以获取租约。这是一种“恢复”模式,以确保在稳定状态下运行时,如果一个实例发生故障,另一个实例会通知并在另一个实例停止的地方继续操作。
如果您查看锁定机制的实现(StorageScheduleMonitor.cs):
因此,基于@ volodymyr-bilyachat答案,有两种可能性:
拥有独立的存储帐户:如果您在每个环境中都有一个存储帐户(dev / staging / prod),这是有意义的
指定JobHostConfiguration类的HosId属性:
var config = new JobHostConfiguration();
config.HostId = "dev|staging|prod";
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句