首页 > 解决方案 > 使 Azure Webjob 计时器触发器不作为单例运行

问题描述

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

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

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

标签: azure-webjobsazure-webjobssdkazure-webjobs-continuous

解决方案


单例属性确保在分布式锁定的帮助下只运行一个实例,这些与 webjobs SDK 有关。

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

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


推荐阅读