Azure Webjob计时器触发器不会触发

Abh*_*mar 0 azure azure-webjobs timer-trigger

我们有两个使用TimerTrigger运行的Azure Webjob部署(Prod和Test).这两个Web应用程序都有单个实例.根据这篇文章,TimeTriggers使用单例锁来确保没有并行调用.这两个实例使用相同的存储帐户.我们面临的问题是,只有其中一个部署似乎获得锁定,而其他部署无法获取锁定.如果我们停止第一个webjob,则第二个获取锁定并开始处理,反之亦然.

锁是否依赖于存储帐户?我们如何确保这两个部署都具有单独的锁定机制并同时运行?

Tho*_*mas 9

你是对的,你必须使用不同的存储帐户.

文档:

在幕后,TimerTrigger使用WebJobs SDK 的Singleton功能来确保在任何给定时间只有一个触发函数的实例正在运行.当JobHost启动时,对于每个TimerTrigger函数,都会执行blob租约(Singleton Lock).此分布式锁定可确保您的计划函数的任何一个实例都可以随时运行.如果当前未租用该功能的blob,则该功能将获取租约并立即开始按计划运行.如果无法获取blob租约,通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动.发生这种情况时,主机将继续定期检查是否可以获得租约.这是作为一种"恢复"模式完成的,以确保在运行稳定状态时,如果实例发生故障,另一个实例通知并在另一个实例停止的地方拾取.

如果你看一下锁定机制的实现(StorageScheduleMonitor.cs):

  • 该作业获取容器内的锁(blob).
  • blob位于特定目录内(基于HostId).
  • blob的名称不可配置.

所以根据@ volodymyr-bilyachat的答案,有两种可能性:

  • 分离存储帐户:如果每个环境都有一个存储帐户(dev/staging/prod),这是有意义的

  • 指定JobHostConfiguration类的HosId属性:

    var config = new JobHostConfiguration();
    config.HostId = "dev|staging|prod";
    
    Run Code Online (Sandbox Code Playgroud)