azure-webjobs - 使 Azure Webjob 计时器触发器不作为单例运行
问题描述
我有一组工作函数,它们在创建时根据需要从服务总线主题订阅中提取。当通过排队的配置消息创建新订阅时,会创建新的工作人员,该消息会触发作业以启动新工作人员以收听订阅。问题是现在我希望能够在应用程序横向扩展时横向扩展收听订阅的工作人员。由于供应作业仅在单个实例上创建工作器,因此横向扩展的有效性显着降低。
我的想法是创建第二个配置作业,该作业从计时器触发器运行,以将正在运行的作业同步到当前的订阅列表。我在计时器作业中遇到了与服务总线触发器相同的问题,因为它在 Web 作业中作为单例运行,并且每次运行时都可能在同一个作业实例上运行,这意味着我仍然可能有无论我向外扩展多少,每个订阅可能有 2 个作业实例。
我的问题是,是否可以创建一个不作为单例运行的计时器作业?意思是,我可以配置一个计时器作业,对于横向扩展的 Web 作业的每个实例,该作业将以设定的时间间隔运行吗?
解决方案
单例属性确保在分布式锁定的帮助下只运行一个实例,这些与 webjobs SDK 有关。
此外,我们还有单例侦听器,并添加了一些设置以确保您的函数在单个实例上作为单例运行。为确保在 Web 应用扩展到多个实例时仅运行该函数的单个实例,请在该函数上应用侦听器级别的单例锁([Singleton(Mode = SingletonMode.Listener)])
。在 JobHost 启动时获取侦听器锁。如果三个横向扩展实例同时启动,则只有一个实例获取锁,并且只有一个侦听器启动。
现在,如果不分配单例以避免一次运行每个实例,请参阅MS Docs中的 Multiple Instances文档
推荐阅读
- c - 我应该研究哪个函数来在 C 中创建一个套接字?
- ajax - 从 JSON 接收数据到函数并保存在 laravel
- java - 当我尝试使用 Selenide 获取 window.dataLayer 时出现 StaleElementReferenceException
- python - /collection/order/ FOREIGN KEY 约束处的 IntegrityError 添加新对象时出现错误
- java - 传递基类类型的引用时,JSON 仅序列化基类字段
- python - GitHub Actions Pynsist NSIS YAML
- discord - 我想在 discord.js v12 中获取系统消息通道
- android - Android KTX:如何覆盖 Kotlin 添加的属性扩展
- timer - stm32f4 计数脉冲(如何调整上升沿电压?)
- php - Nuxt SPA 使用密码授予令牌有什么问题