什么是 TickerQ
TickerQ 是一个针对 .NET 平台的后台任务调度库,它的设计目标是轻量、无反射开销、高性能以及良好的可观测性。它支持基于时间(一次性任务)与基于 Cron 表达式的定时任务,带有任务重试策略、并支持持久化到数据库、可分布式部署、以及实时监控界面(Dashboard)。它通过源码生成(Source Generator)来在编译阶段设置任务与调度,无需在运行时使用反射来查找任务方法,从而提升启动速度和运行效率。
TickerQ 的核心特性
- 定时与 Cron 调度:支持一次性任务(TimeTicker)和周期性任务(CronTicker),满足不同类型的调度需求。
- 无反射 / 源码生成:在编译期就把任务与调度相关的样板代码生成好,任务发现与调用开销低。
- 持久化支持(EF Core):可以将任务状态、执行历史、调度记录保存到数据库,通过 TickerQ.EntityFramework 扩展包实现。
- Dashboard 界面:提供实时界面,用来监控任务调度状态、执行情况、失败重试等,可手动触发或取消任务。
- 重试、节流、冷却、优先级控制:任务失败后的重试策略、任务执行间隔、并发控制等功能完备。
- 分布式/多节点支持:通过数据库持久化和锁机制,可以在多个实例中共同调度任务而避免重复执行。
安装与基础配置
要在你的 .NET 项目中使用 TickerQ,可以按照以下步骤执行:
1. 安装包
在 .NET 项目的根目录或通过 NuGet 命令行安装:
dotnet add package TickerQ
如果你需要数据库持久化功能,还需加上:
dotnet add package TickerQ.EntityFrameworkCore
如果想用 Dashboard 实时监控,还需:
dotnet add package TickerQ.Dashboard
2. 在 Program.cs 或启动配置中注册
在 ASP.NET Core 或其他支持依赖注入的 .NET 应用中,你可以在程序初始化处添加:
builder.Services.AddTickerQ(options =>
{
options.SetMaxConcurrency(10);
options.AddOperationalStore<MyDbContext>(efOptions =>
{
efOptions.SetExceptionHandler<MyExceptionHandler>();
// 用来将模型定制用于 EF Core migrations
efOptions.UseModelCustomizerForMigrations();
// 在应用重启或恢复期间,是否取消那些错过执行时间的任务
efOptions.CancelMissedTickersOnApplicationRestart();
});
options.AddDashboard(uiOptions =>
{
uiOptions.BasePath = "/tickerq-dashboard";
uiOptions.AddDashboardBasicAuth(); // 可选的简单认证
});
});
之后,需要在程序管线中激活:
app.UseTickerQ();
3. 定义任务
任务定义通常使用特性(Attribute)来标注要被调度执行的方法。例如:
public class MyJobs
{
[TickerFunction(FunctionName = "CleanupLogs", CronExpression = "0 0 * * *")]
public Task CleanupLogs()
{
// 每天午夜执行清理日志
return Task.CompletedTask;
}
}
这会注册一个 CronJob,每天 “0 0 * * *” 时间点运行 CleanupLogs 方法。
一次性任务或延迟任务(TimeTicker)可以通过注入 ITimeTickerManager<TimeTicker> 来手动添加,例如:
await _timeTickerManager.AddAsync(new TimeTicker
{
Function = "SendWelcomeEmail",
ExecutionTime = DateTime.UtcNow.AddMinutes(5),
Request = TickerHelper.CreateTickerRequest<string>("user@example.com"),
Retries = 3,
RetryIntervals = new[] {30, 60, 120} // 重试间隔为秒数
});
应用场景与对比分析
适用场景
- 微服务或Web API中需要后台任务,如定期报告生成、日志清理、数据清洗等。
- 希望任务调度可监控、可视化、具有重试与失败恢复能力的企业级应用。
- 分布式部署环境下,任务不能因单节点问题丢失或重复执行。
- 对性能有一定要求,希望调度器启动快、内存开销小、调度精度高。
与 Hangfire / Quartz.NET 的对比优势
- 相比 Hangfire 和 Quartz.NET,TickerQ 的启动与运行开销更小,因为任务注册与发现通过源码生成,无需反射。
- 在持久化、重试、分布式协调方面,TickerQ 提供了现代化设计,并直接支持 EF Core。
- Dashboard 是官方提供、实时实时的,操作与可视性较强。
- 在大型任务数、频繁调度需求或对资源敏感(比如云函数、容器环境、Lambda /容器启动时间敏感)的场景中,TickerQ 优势更明显。
注意事项与使用建议
- 在初次迁移或集成时,务必确认所有任务函数使用了正确的标注及命名一致性(FunctionName),以保证调度器能正确识别与触发任务。
- 如果不使用持久化(例如只用内存模式),应用重启会丢失未执行的任务,需要评估是否能接受这种情况。
- 在多节点部署时要注意数据库锁或任务所有权机制:确保每个任务仅被一个节点执行防止重复。
- 重试策略、任务间隔、优先级等需调优,避免大量失败任务或重试导致负载过高。
- 安全性:Dashboard 接口如果部署在公共网络,需要开启认证机制,避免被滥用。
总结
TickerQ 是一个现代、轻量、功能全面的 .NET 后台任务调度库,对于需要可靠、可观测、分布式、安全调度任务的项目来说,是一个非常有竞争力的选择。它在启动速度、运行效率、监控界面以及持久化支持方面都有明显优势。如果你正在使用 Quartz.NET、Hangfire 或者其他调度方案,不妨尝试 TickerQ 来进行比较和评估。