ASP.NET Core下Hangfire高可用双服务器任务重复执行问题求解
解决ASP.NET Core Hangfire高可用部署下任务重复执行问题
核心问题根源
多服务器实例部署时,若使用本地内存存储、未配置共享存储或服务器唯一标识,Hangfire各节点会独立调度任务,最终导致重复执行。以下是可落地的解决方案:
切换为分布式共享存储
必须将Hangfire默认的内存存储替换为SQL Server、Redis这类分布式存储,让所有实例共享任务队列与状态。示例配置:
Redis版本:services.AddHangfire(config => { config.UseRedisStorage("your-redis-connection-string"); });SQL Server版本:
services.AddHangfire(config => { config.UseSqlServerStorage("your-sql-connection-string"); });给每个Hangfire Server设置唯一标识
每个服务器实例需要独一无二的名称,防止Hangfire将多个节点判定为同一实例。注册Server时配置:services.AddHangfireServer(options => { options.ServerName = $"HangfireNode_{Environment.MachineName}_{Guid.NewGuid().ToString().Substring(0, 8)}"; });确保定时任务的唯一性
添加定时任务时必须指定唯一ID,用AddOrUpdate替代Add,确保同一ID的任务只会被创建一次:// 在Startup.cs或初始化代码中执行 RecurringJob.AddOrUpdate( "hourly-data-sync", // 全局唯一的任务ID () => DataSyncService.Sync(), Cron.Hourly);限制任务并发执行
给任务添加并发禁用特性,保证同一任务同一时间仅能被一个实例执行:[DisableConcurrentExecution(60)] // 60秒内禁止同一任务并发,可根据任务实际时长调整 public async Task Sync() { // 任务执行逻辑 }也可全局限制单实例的Worker数量(按需调整):
services.AddHangfireServer(options => { options.WorkerCount = 1; // 每个实例仅启动1个Worker处理任务 });排查重复注册逻辑
确认任务注册代码只执行一次,比如放在Startup.Configure或Program.cs的初始化流程中,避免多实例启动时重复添加相同任务。
内容的提问来源于stack exchange,提问作者Mohamed Ahmed
相关产品推荐
相关产品推荐

