如何将Azure Function v4设置为单实例 禁止特定函数随应用扩缩容
Azure Function v4 .NET 6 Isolated 模式下指定Timer Trigger函数单例运行方案
首先明确:你不需要将整个函数应用设为单例,Timer Trigger原生就支持跨实例单例执行的能力,完全匹配你的需求:即使整个函数应用横向扩容到多个实例,指定的Timer Trigger同一时间只会有一个实例运行,不会出现多实例同时执行的情况。
具体实现步骤
- 首先确认Timer Trigger的
UseMonitor属性为开启状态(该配置默认值为true,显式配置更稳妥),该配置会依赖AzureWebJobsStorage存储账户的Blob租约实现分布式锁,保证同一时间只有一个实例执行定时任务。
示例代码:
public class MySingletonTimerFunction { [Function("SingletonTimerJob")] public void Run([TimerTrigger("0 0 */1 * * *", UseMonitor = true)] TimerInfo timerInfo) { // 业务逻辑实现 } }
- 如果需要额外保证任务不会重入(即上一次执行未结束时,到了下一次触发时间直接跳过),可以在
host.json中添加Timer扩展的并发限制配置:
{ "version": "2.0", "extensions": { "timers": { "maxDegreeOfParallelism": 1, "runOnStartup": false } } }
- 如果你需要的是整个函数应用所有函数都不允许扩缩容(该配置会影响应用内的其他函数,仅在你确认所有函数都不需要扩容时使用),可以在函数应用的环境变量/应用配置中添加键
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT,值设为1,即可强制整个应用最多只能有1个运行实例。
注意事项
- 确保你的函数应用配置的
AzureWebJobsStorage连接字符串有效,Timer Trigger的分布式锁依赖该存储账户实现,存储不可用会导致锁机制失效。 - 若你的Timer Trigger的CRON表达式间隔小于任务的平均执行时长,建议开启
TimerInfo.IsPastDue判断,跳过过期的触发任务,避免业务异常。
内容的提问来源于stack exchange,提问作者Pure.Krome
相关产品推荐
相关产品推荐

