使 Azure Webjob 计时器触发器不作为单例运行

Posted

技术标签:

【中文标题】使 Azure Webjob 计时器触发器不作为单例运行【英文标题】:Make Azure Webjob Timer Trigger Not Run as a Singleton 【发布时间】:2021-11-25 20:21:08 【问题描述】:

我有一组工作函数,它们在创建时根据需要从服务总线主题订阅中提取。当通过排队的配置消息创建新订阅时,会创建新的工作人员,该消息会触发作业以启动新工作人员以收听订阅。问题是现在我希望能够在应用程序横向扩展时横向扩展收听订阅的工作人员。由于配置作业仅在单个实例上创建工作器,因此横向扩展的效率显着降低。

我的想法是创建第二个配置作业,该作业从计时器触发器运行,以将正在运行的作业同步到当前订阅列表。我遇到与服务总线触发器相同的计时器作业问题,因为它在 Web 作业中作为单例运行,并且每次运行时可能会在同一作业实例上运行,这意味着我仍然可能有无论我向外扩展多少,每个订阅可能有 2 个作业实例。

我的问题是,是否可以创建一个不作为单例运行的计时器作业?意思是,我可以为每个横向扩展的 Web 作业实例配置一个计时器作业,该作业将按设定的时间间隔运行吗?

【问题讨论】:

【参考方案1】:

Singleton 属性通过分布式锁定确保只运行一个实例,这些与 webjobs SDK 相关。

我们还有单例侦听器,并添加了一些设置以确保您的函数在单个实例上作为单例运行。为确保在 Web 应用扩展到多个实例时仅运行该函数的单个实例,请在函数 ([Singleton(Mode = SingletonMode.Listener)]) 上应用侦听器级别的单例锁。在 JobHost 启动时获取侦听器锁。如果三个横向扩展实例同时启动,则只有一个实例获取锁,并且只有一个监听器启动。

现在如果不分配单例以避免一次运行每个实例,请参阅 MS Docs 中的 Multiple Instances documentation

【讨论】:

不需要将单例属性添加到定时器触发的作业中,它是自动完成的,这是我的问题,我不希望定时器作为单例运行!我希望该函数在每个正在运行的实例中按计划运行。

以上是关于使 Azure Webjob 计时器触发器不作为单例运行的主要内容,如果未能解决你的问题,请参考以下文章

禁用触发的 Azure WebJob

在 Azure WebJob 中动态启用/禁用触发功能

单 Azure 函数多定时器触发

Azure - 将 WCF 服务作为 WebJob 运行

WinSCP 无法在 Azure 应用服务上作为 WebJob 运行

Azure webjob 似乎不尊重 MaxDequeueCount 属性