Abh*_*mar 0 azure azure-webjobs timer-trigger
我们有两个使用TimerTrigger运行的Azure Webjob部署(Prod和Test).这两个Web应用程序都有单个实例.根据这篇文章,TimeTriggers使用单例锁来确保没有并行调用.这两个实例使用相同的存储帐户.我们面临的问题是,只有其中一个部署似乎获得锁定,而其他部署无法获取锁定.如果我们停止第一个webjob,则第二个获取锁定并开始处理,反之亦然.
锁是否依赖于存储帐户?我们如何确保这两个部署都具有单独的锁定机制并同时运行?
你是对的,你必须使用不同的存储帐户.
从文档:
在幕后,TimerTrigger使用WebJobs SDK 的Singleton功能来确保在任何给定时间只有一个触发函数的实例正在运行.当JobHost启动时,对于每个TimerTrigger函数,都会执行blob租约(Singleton Lock).此分布式锁定可确保您的计划函数的任何一个实例都可以随时运行.如果当前未租用该功能的blob,则该功能将获取租约并立即开始按计划运行.如果无法获取blob租约,通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动.发生这种情况时,主机将继续定期检查是否可以获得租约.这是作为一种"恢复"模式完成的,以确保在运行稳定状态时,如果实例发生故障,另一个实例通知并在另一个实例停止的地方拾取.
如果你看一下锁定机制的实现(StorageScheduleMonitor.cs):
所以根据@ volodymyr-bilyachat的答案,有两种可能性:
分离存储帐户:如果每个环境都有一个存储帐户(dev/staging/prod),这是有意义的
指定JobHostConfiguration类的HosId属性:
var config = new JobHostConfiguration();
config.HostId = "dev|staging|prod";
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1803 次 |
| 最近记录: |