以下是修改后的《任务框架需求说明书》更新版,重点调整触发方式配置化和事件类动态绑定相关内容:
任务框架需求说明书
版本:1.2
日期: 2025-04-30
变更记录
版本 | 修改内容 | 修改人 | 日期 |
---|---|---|---|
1.2 | 支持配置化触发规则,扩展事件类型 | Fisher | 2025-04-30 |
1. 概述
设计一个轻量级、高可用、插件化的单机任务处理框架,支持定时任务、事件驱动任务,满足CPU/IO混合型任务的快速执行与容错需求。
1.1 背景
为满足业务场景中定时任务、事件驱动、优先级任务的高效处理需求,需设计一个单机部署、高可用、轻量级的任务处理框架,支持并行执行、失败重试、资源隔离等核心功能,同时具备可观测性和扩展性。
1.2 目标
- 提供多种任务触发方式(定时、事件)。
- 保障任务执行的稳定性与可靠性(失败重试、资源隔离)。
- 支持任务全生命周期监控与日志追踪。
- 通过插件化设计实现灵活扩展。
2. 业务场景分析
2.1. 范围
- 适用场景:单机部署,任务无需分布式分片,单任务最长执行时间 ≤60 分钟。
- 不适用场景:分布式任务调度、复杂工作流编排(DAG)、GPU 等特殊资源需求。
2.2 触发方式
触发类型 | 描述 | 配置示例 |
---|---|---|
定时任务 | 通过Cron表达式配置触发时间 | "trigger": "0/5 * * * * ?" |
事件任务 | 通过类全限定名绑定事件监听器,事件到达时触发 | "trigger": "MyApp.PaymentSuccessEvent" |
3. 功能性需求
3.1 功能需求
模块 | 功能描述 |
---|---|
任务定义 | - 支持任务元数据配置(名称、优先级、超时时间、重试策略)。 |
任务触发 | - 定时触发(Cron 表达式、固定频率/延迟) - 事件驱动(外部 API 或消息队列触发) - 优先级队列(基于任务优先级调度)。 |
任务执行 | - 并行执行(多线程池管理) - 失败重试机制(指数退避/固定间隔,最大重试次数可配置)。 |
资源管理 | - 线程级隔离(独立线程池分配) - 线程池参数动态调整(核心线程数、队列容量)。 |
结果反馈 | - 异步回调通知(HTTP 或自定义协议) - 任务状态查询接口(运行中/成功/失败)。 |
日志与监控 | - 输出 NLog 格式日志,按任务 ID 全链路追踪 - 采集吞吐量、延迟、积压任务数等监控指标。 |
3.2 非功能需求
维度 | 要求 |
---|---|
可用性 | - 单机高可用:任务失败自动恢复、线程池熔断机制 - 进程守护(防止程序崩溃无响应)。 |
性能 | - 吞吐量 ≥100 任务/秒(单机) - 任务延迟 ≤30 秒(90% 分位数)。 |
可观测性 | - 集成 Prometheus/Grafana 监控看板 - 报警规则:任务失败率 >5% 或积压任务 >1000。 |
扩展性 | - 插件化架构:支持自定义触发器、执行策略、日志组件 - 核心模块与插件解耦(SPI 机制)。 |
安全性 | - 敏感参数加密存储(如数据库密码) - 日志脱敏(不记录敏感数据)。 |
3.2 任务配置规则
- 配置格式:支持JSON/YAML定义任务元数据,包含以下字段:json
{ "taskId": "OrderTimeoutCheck", "triggerType": "Cron|Event", "triggerExpression": "0 0/10 * * * ?", // Cron表达式或事件类名 "priority": "Medium", "retryPolicy": { "maxRetries": 3, "backoff": "Exponential" } }
- 动态加载:
- 事件类需实现
IEventListener
接口,框架通过反射动态实例化并绑定事件。 - 配置文件热更新:修改配置后无需重启,自动重新加载任务规则。
- 事件类需实现
4. 系统架构设计
4.1 组件图
[任务配置中心] ——(加载配置)→ [调度中心]
↓
[事件监听器工厂] ←(动态绑定)→ [IEventListener实现类]
↓
[线程池执行器]
4.2 架构图
plaintext
+-------------------+ +-------------------+ +-------------------+
| 任务触发器 | | 任务调度器 | | 任务执行器 |
| - 定时触发器 | → | - 优先级队列管理 | → | - 线程池管理 |
| - 事件触发器 | | - 任务分发策略 | | - 重试策略 |
+-------------------+ +-------------------+ +-------------------+
↓
+-------------------+ +-------------------+
| 监控与日志系统 | ← | 任务状态存储 |
| - 指标采集 | | - 内存队列 |
| - 日志追踪 | +-------------------+
+-------------------+
4.3 核心组件
触发器(Trigger)
- 定时触发器:基于 Cron 表达式或固定间隔触发任务。
- 事件触发器:监听外部事件(如 HTTP 请求、消息队列消息)。
- 优先级调度器:按任务优先级从队列中选取任务执行。
调度器(Scheduler)
- 任务队列:内存队列,支持优先级排序(如最小堆实现)。
- 分发策略:根据任务类型分配至快/慢线程池(
fast-pool
和slow-pool
)。
执行器(Executor | Worker)
- 线程池:动态配置核心线程数、队列容量、拒绝策略(如 CallerRunsPolicy)。
- 重试策略:支持指数退避(Exponential Backoff)和固定间隔重试。
监控与日志
- 指标采集:通过 Micrometer 暴露 JVM、线程池、任务吞吐量等指标。
- 日志追踪:使用 NLog 输出结构化日志,按任务 ID 关联全链路日志。
5. 技术方案
5.1 技术选型
组件 | 技术方案 | 说明 |
---|---|---|
调度核心 | 自研轻量调度器(基于优先级队列) | 避免 Quartz 的复杂性,满足定制化需求。 |
配置管理 | Microsoft.Extensions.Configuration | 支持JSON/YAML热加载配置 |
事件绑定 | Microsoft.Extensions.DependencyInjection依赖注入 | 自动扫描并注册IEventListener 类 |
调度器 | 基于Quartz.NET扩展 | 支持Cron与事件混合触发模式 |
日志组件 | NLog | 轻量级日志框架,支持 MDC 实现任务 ID 追踪。 |
插件化扩展 | 自研模块 | 通过 加载指定目录里的插件dll |
监控系统 | Prometheus + Grafana | 开箱即用的监控可视化方案。 |
5.2 关键实现
- 优先级队列:使用
PriorityBlockingQueue
实现任务优先级调度。 - 退避策略:指数退避算法示例:C#
public class ExponentialBackoffRetry { public long CalculateDelay(int retryCount) { return (long)Math.Pow(2, retryCount) * 1000; // 单位:毫秒 } }
6. 关键设计细节
6.1 事件任务触发流程
- 配置解析:读取任务配置中的
triggerExpression
,若为事件类名,检查是否实现IEventListener
。 - 监听器注册:通过依赖注入容器动态创建事件监听器实例,订阅对应事件总线。
- 事件触发:当事件发布时,监听器捕获事件并提交任务至执行队列。
6.2 配置热更新机制
- 文件监控:使用
FileSystemWatcher
监听配置文件变更。 - 原子切换:新配置解析成功后替换旧配置,避免中间状态不一致。
- 状态迁移:运行中的任务不受影响,新任务按新规则执行。
6.3 安全性增强
- 类白名单:配置中事件类名必须在预定义白名单内,防止恶意类注入。
- 反射权限:限制动态加载类的访问权限(如沙箱环境运行)。
6.4. 风险与应对
风险 | 应对措施 |
---|---|
任务积压导致内存溢出 | 设置队列容量阈值,超限时丢弃低优先级任务并触发告警。 |
长任务阻塞线程池 | 分离快慢线程池,为长任务设置独立线程池;任务超时强制中断并标记失败。 |
进程崩溃导致任务丢失 | 集成 Supervisor 或 systemd 守护进程,异常退出后自动重启;关键任务状态持久化(可选)。 |
6.5 测试与验证
- 单元测试:覆盖任务超时、重试、优先级抢占场景。
- 压力测试:模拟1000任务/分钟,验证线程池稳定性。
- 混沌测试:强制杀死进程,验证任务恢复能力。
6.6 测试用例补充
测试场景 | 预期结果 |
---|---|
修改Cron表达式配置 | 10秒内新任务按新Cron规则触发 |
事件类名配置错误 | 启动时抛出异常并记录日志,拒绝加载该任务 |
事件监听器内存泄漏 | 监控显示线程数稳定,无OOM |
7. 交付与验收
7.1 交付物
- 框架核心代码(Git 仓库)。
- 插件化扩展示例(如自定义事件触发器)。
- 部署文档、监控配置指南、API 使用手册。
7.2 验收标准
- 功能验收:支持定时、事件、优先级任务触发,失败重试成功率 ≥99%。
- 性能验收:单机吞吐量 ≥100 任务/秒,任务延迟 ≤30 秒(P90)。
- 监控验收:提供 Prometheus 指标看板,日志支持按任务 ID 追踪。
7.3 交付计划
阶段 | 目标 | 周期 |
---|---|---|
MVP | 定时任务+线程池执行+基础监控 | 2周 |
V1.0 | 事件驱动+优先级队列+插件化 | 3周 |
V1.1 | 安全加密+增强告警 | 1周 |
评审确认
- 业务方代表:___________
- 技术负责人:___________
- 日期:___________
注:此版本明确通过配置驱动任务触发规则,实现“零硬编码”的任务管理,同时通过动态绑定机制支持事件驱动的灵活性。