我们有两个使用TimerTrigger运行的Azure We作业的部署(Prod和Test)。这两个网络应用程序都有一个实例。根据这篇文章的说法,TimeTriggers使用单例锁来确保没有并行调用。这两个实例使用相同的存储帐户。我们面临的问题是,只有一个部署似乎获得了锁,而另一个则无法获得锁。如果我们停止第一个网络作业,第二个获得锁并开始处理,反之亦然。
锁是否依赖于存储帐户?我们如何确保这两个部署都有单独的锁定机制,同时运行?
发布于 2016-10-28 02:31:19
你说得对,你必须使用不同的存储帐户。
来自文档
在幕后,TimerTrigger使用WebJobs SDK的Singleton特性来确保在任何给定时间只运行一个触发函数实例。在启动JobHost时,对每个TimerTrigger函数都使用blob租约( Singleton )作为。这个不信任的锁确保在任何时候只运行调度函数的单个实例。如果该函数的blob当前未被租用,则该函数将获得租约并立即开始按计划运行。如果不能获得blob租约,通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动。当发生这种情况时,主机将继续定期检查是否可以获得租约。这是一种“恢复”模式,以确保在运行稳定状态时,如果一个实例发生故障,另一个实例会注意到另一个实例停止的地方。
如果您查看锁定机制(StorageScheduleMonitor.cs)的实现:
因此,基于@volodymyr-bilyachat的回答,有两种可能性:
https://stackoverflow.com/questions/40296109
复制相似问题