Hangfire.HttpJob Docker部署实战:调度中心与Agent分离部署的完整教程
2026/8/19 21:31:31 网站建设 项目流程

Hangfire.HttpJob Docker部署实战:调度中心与Agent分离部署的完整教程

【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob

Hangfire.HttpJob 是专为 Hangfire 打造的 HTTP 作业调度扩展,它让"任务调度"与"业务逻辑"彻底解耦:调度中心只负责按计划发起 HTTP 请求,业务程序则作为独立 Agent 接收请求并执行。本文是一份面向初学者的Hangfire.HttpJob Docker 部署教程,手把手带你完成调度中心与 Agent 分离部署,全程可视化、可验证,适合第一次接触该框架的开发者。

为什么选择调度中心与 Agent 分离部署?

传统定时任务把调度器和业务代码塞在同一个进程里,一旦业务膨胀,升级、扩容、故障隔离都变得棘手。Hangfire.HttpJob 的分离架构正好解决这些痛点:

角色职责部署形态
调度中心管理作业、触发执行、Dashboard 监控独立 Hangfire Server
业务 Agent接收 HTTP 请求,真正执行业务代码独立 Web 程序,可多实例
  • 🚀业务与调度互不影响:Agent 升级重启,调度中心毫不知情、照常运转
  • 📈弹性伸缩:Agent 可以横向扩容,调度中心自动分发
  • 🛡️故障隔离:某个 Agent 崩溃不会拖垮整个调度系统

Hangfire.HttpJob 核心能力一览

作为调度中心的"大脑",Hangfire.HttpJob 提供了开箱即用的能力:

  • 延迟任务:通过 HTTP POST 或 Dashboard 一键添加,到点自动执行
  • 周期任务:支持 Cron 表达式,灵活定制执行频率
  • RESTful API:任何语言都可以通过接口创建作业,无需引入 C# 客户端
  • 可视化监控:执行日志、进度条、耗时、状态一目了然

而业务侧的 Agent 支持三种任务生命周期,覆盖几乎所有业务场景:

  • Transient(瞬时任务):执行完即结束
  • Singleton(单例任务):同一时刻只允许一个实例执行
  • HangUntilStop(常驻任务):持续运行直到收到停止指令

三种特性分别由 TransientJobAttribute、SingletonJobAttribute、HangJobUntilStopAttribute 三个特性声明,非常直观。

部署前准备:认识两个核心组件

先明确分工:调度中心是一个承载 Hangfire + Hangfire.HttpJob 的 ASP.NET Core 程序;Agent 是引入Hangfire.HttpJob.Agent包的业务 Web 程序。两者通过 HTTP 通信,天然适合容器化。

在动手前,先通过以下命令获取源码(可选,也可以直接用 NuGet 包):

git clone https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob

项目中的Test目录自带多个可直接运行的示例,例如 MemoryHangfire(调度中心)和 TestHangfireAgent(Agent),本文就以它们为蓝本。

第一步:Docker 化调度中心

调度中心的 Docker 化非常简单,项目已经内置了现成的 Dockerfile,参考 MemoryHangfire/Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 COPY . /publish WORKDIR /publish ENV ASPNETCORE_URLS=http://*:5000 EXPOSE 5000 ENTRYPOINT ["dotnet", "MemoryHangfire.dll"]

这段配置的精髓在于:容器内监听 5000 端口,宿主机映射后即可对外服务。如果你使用 SQL Server 存储,直接参考 TestSqlserver/Dockerfile,其余 Redis、PostgreSql 版本的示例也一应俱全。

构建并启动调度中心:

docker build -t hangfire-center . docker run -d -p 5000:5000 --name hangfire-center hangfire-center

启动后,调度中心的配置都在 appsettings.json 中管理,其中两个关键区块:

  • HangfireSettings:服务名、Worker 数量、作业队列、Dashboard 登录账号等
  • HttpJobOptions:时区、超时时间、邮件/钉钉告警、作业过期天数等

建议把IsOpenLogin设为true并配置Users,为 Dashboard 加上 Basic 认证,防止接口被随意调用。

第二步:Docker 化业务 Agent

Agent 的接入代码极其精简,核心只有两行,参考 TestHangfireAgent/Startup.cs:

services.AddHangfireJobAgent(); app.UseHangfireJobAgent();

真正重要的是 appsettings.json 中JobAgent节点的配置:

配置项作用示例值
Enabled是否启用 Agenttrue
SitemapUrlAgent 站点路径/jobagent
EnabledBasicAuth是否开启 Basic 认证true
EnableAutoRegister是否自动注册到调度中心true
RegisterAgentHostAgent 对外地址http://localhost:5002
RegisterHangfireUrl调度中心作业接口http://localhost:5000/job

写好 Dockerfile 后构建运行:

docker build -t hangfire-agent . docker run -d -p 5002:80 --name hangfire-agent hangfire-agent

Agent 支持多种存储扩展,MSSQL、MySQL、PostgreSql、Redis 的 Console 包分别位于 Agent 目录下的对应子项目中,按需引入即可。

第三步:Agent 自动注册与心跳保活

分离部署最担心的就是"调度中心不知道 Agent 在哪"。Hangfire.HttpJob 通过自动注册 + 心跳机制完美解决:

  • 自动注册:Agent 启动时,会自动把自身地址上报给RegisterHangfireUrl指定的调度中心接口
  • 心跳保活:Agent 持续发送心跳,调度中心据此判断 Agent 是否存活;Agent 掉线后任务会自动转移到其他可用实例

这就意味着:你只管docker run新 Agent 实例,调度中心会自动发现它,无需任何手工配置,真正做到了"开箱即注册"。

第四步:验证部署效果

打开http://localhost:5000/hangfire,登录后即可看到作业总览。在 Dashboard 上可以:

  1. 添加延迟作业:填写目标 URL、请求方式、延迟时间
  2. 添加周期作业:配置 Cron 表达式,实现定时触发
  3. 查看执行详情:包括执行状态、耗时、日志和进度

如果能看到任务Succeeded状态和执行日志,说明调度中心与 Agent 已经成功"握手",整个分离部署链路完全打通了。🎉

常见问题排查与部署技巧

  • Agent 注册不上:确认RegisterHangfireUrl指向调度中心/job接口,且RegisterHangfireBasicName/Pwd与调度中心配置一致
  • 任务一直排队不执行:检查 Agent 是否存活、心跳是否正常,可在调度中心后台查看 Agent 在线状态
  • 时区错乱:在调度中心的HttpJobOptions中设置DefaultTimeZone
  • 💡日志持久化:Dockerfile 中已预留volume@/opt/hangfire/logs:/publish/Logs@注释,挂载日志目录便于排查问题
  • 💡多环境隔离:通过环境变量覆盖 appsettings 中的连接串和注册地址,一套镜像即可部署到测试、生产环境

总结

通过本文的Hangfire.HttpJob Docker 部署实战,你已经掌握了调度中心与 Agent 分离部署的完整流程:Docker 化调度中心、独立部署业务 Agent、自动注册与心跳保活、Dashboard 可视化验证。这种架构让定时任务系统具备了高可用、易扩展、强隔离的能力,是生产环境的理想选择。现在就动手试试吧!

【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询