1. 背景与痛点:我们为什么又造了一个“轮子”? 在 .NET 生态中,提到后台任务调度,我们通常会想到 Quartz.NET、Hangfire 或者是 ASP.NET Core 自带的 BackgroundService。它们都非常优秀,但在现代云原生和微服务架构下,我们有时会面临一些新的挑战:

原生定时器的局限:简单的 Timer 或 IHostedService 缺乏分布式协调能力,多实例部署时容易导致任务重复执行,且没有可视化界面监控状态。 传统框架的厚重:某些成熟的调度框架与特定存储或设计模式深度绑定,对于只需要轻量级分布式调度和可视化管理的团队来说,接入成本较高。 缺乏现代化的调度策略:在集群环境中,我们往往希望任务能像 Kubernetes 调度 Pod 一样,具有“节点标签选择 (Node Selector)”、“广播执行 (Broadcast)”、“分片执行 (Sharded)”等更灵活的路由能力。 基于这些痛点,KubeJob 应运而生。

  1. KubeJob 是什么? KubeJob 是一个强大、分布式且可嵌入的 .NET 任务调度框架。它深度借鉴了 Kubernetes 的架构与调度概念(Control Plane / Data Plane),为您提供了一种现代化的、云原生的任务调度选择。

无论是希望在一个单体应用中快速嵌入带有 Web 面板的定时任务,还是在拥有数十个节点的微服务集群中进行复杂的任务下发,KubeJob 都能轻松胜任。

🔗 开源地址: https://github.com/hueifeng/KubeJob (欢迎给个 Star 支持一下!)

  1. 核心架构与亮点 KubeJob 严格分离了调度逻辑与执行逻辑,整体分为 KubeJob.Server (控制面) 和 KubeJob.Worker (数据面)。

👑 真正的云原生调度模型 借鉴 K8s,KubeJob 引入了 Node Selectors (节点选择器)。你可以给不同的 Worker 节点打上标签(如 env=prod, role=data-processing),调度器会智能地将任务分发给匹配的节点。 此外,它支持丰富的执行模型 (Execution Models): Standalone:单点执行,集群中挑选一个节点运行。 Broadcast:广播执行,让所有符合条件的节点同时运行该任务。 Sharded:分片执行(规划中/支持中),处理大规模数据的利器。 🛡️ 高可用与主节点选举 (Leader Election) 不用担心部署多个 Server 节点导致任务重复触发。KubeJob 内置了基于存储的分布式锁,自动进行 Leader 选举。只有 Leader 会执行核心调度,完美避免竞态条件。 💻 开箱即用的高颜值 Dashboard 无需自己手写前端!KubeJob 内置了基于 Bootswatch 的深色模式响应式 Web 控制台。你可以直接在 UI 上监控节点健康度、手动触发任务、动态修改 Cron 表达式,甚至直接在网页中查看带有深色终端风格的实时异常堆栈和日志。 ⚙️ 智能的并发与超时控制 原生支持 Concurrency Policies(允许并发、禁止并发、替换旧任务),并完美结合 .NET 的 CancellationToken,实现任务的超时熔断与平滑退出 (Graceful Shutdown)。 4. 极简接入:如何开始? KubeJob 提供了极佳的开发者体验。在最常见的单体应用 (Unified Setup) 场景下,只需几行代码即可将 Server(含面板)和 Worker 嵌在同一个进程中。

安装 NuGet 包:

dotnet add package KubeJob 配置 Program.cs:

var builder = WebApplication.CreateBuilder(args);

// 1. 注册 KubeJob 服务端 (控制面 + 仪表盘),此处演示使用内存存储 builder.Services.AddKubeJobServer(opts => opts.UseInMemory()); builder.Services.AddKubeJobDashboard(routePrefix: "/admin/jobs");

// 2. 注册 KubeJob 工作节点 (数据面) builder.Services.AddKubeJobWorker(options => { options.ServerEndpoint = "http://localhost:5041"; // 指向自身 options.MaxConcurrentJobs = 10; options.Labels.Add("role", "default-worker"); });

// 3. 注册你的业务任务 builder.Services.AddTransient();

var app = builder.Build();

// 初始化数据库 Schema app.InitializeKubeJobDatabase(); app.UseRouting(); app.MapControllers(); app.Run(); 编写你的第一个 Job: 只需实现 IKubeJob 接口,并打上 [KubeJob] 特性即可:

using KubeJob.Core.Attributes; using KubeJob.Core.Context; using KubeJob.Core.Enums; using KubeJob.Core.Interfaces;

[KubeJob("my-first-job", Cron = "*/5 * * * *", ExecuteModel = ExecuteModel.Standalone)] public class MyFirstJob : IKubeJob { public async Task ExecuteAsync(KubeJobContext context, CancellationToken token) { Console.WriteLine($"任务 {context.RunId} 正在节点 {context.WorkerId} 执行!"); await Task.Delay(2000, token); // 模拟耗时操作 } } 启动应用,访问 /admin/jobs,即可看到高颜值的任务控制台了!

  1. 结语 我们希望 KubeJob 能为 .NET 开发者提供一种更符合现代架构审美的调度方案。目前项目已经发布了初始版本,并支持 In-Memory 和 PostgreSQL 存储,后续还将支持更多数据库(如 SQL Server, Redis 等)。

欢迎各位大佬前往 GitHub 仓库 提 Issue、提交 PR,一起共建这个现代化的 .NET 调度框架!

如果您喜欢这个项目,请不要吝啬您的 Star ⭐️,这是对开源作者最大的鼓励!