Skip to content

以下是修改后的《任务框架需求说明书》更新版,重点调整触发方式配置化事件类动态绑定相关内容:


任务框架需求说明书

版本:1.2
日期: 2025-04-30


变更记录

版本修改内容修改人日期
1.2支持配置化触发规则,扩展事件类型Fisher2025-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 核心组件

  1. 触发器(Trigger)

    • 定时触发器:基于 Cron 表达式或固定间隔触发任务。
    • 事件触发器:监听外部事件(如 HTTP 请求、消息队列消息)。
    • 优先级调度器:按任务优先级从队列中选取任务执行。
  2. 调度器(Scheduler)

    • 任务队列:内存队列,支持优先级排序(如最小堆实现)。
    • 分发策略:根据任务类型分配至快/慢线程池(fast-poolslow-pool)。
  3. 执行器(Executor | Worker)

    • 线程池:动态配置核心线程数、队列容量、拒绝策略(如 CallerRunsPolicy)。
    • 重试策略:支持指数退避(Exponential Backoff)和固定间隔重试。
  4. 监控与日志

    • 指标采集:通过 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 事件任务触发流程

  1. 配置解析:读取任务配置中的triggerExpression,若为事件类名,检查是否实现IEventListener
  2. 监听器注册:通过依赖注入容器动态创建事件监听器实例,订阅对应事件总线。
  3. 事件触发:当事件发布时,监听器捕获事件并提交任务至执行队列。

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周

评审确认

  • 业务方代表:___________
  • 技术负责人:___________
  • 日期:___________

:此版本明确通过配置驱动任务触发规则,实现“零硬编码”的任务管理,同时通过动态绑定机制支持事件驱动的灵活性。