Skip to content

LastLighter/JobManager

Repository files navigation

任务调度系统 Demo

该项目基于 Next.js App Router,实现了一个用于管理大规模文件处理任务的调度系统。支持从文本文件或手动输入导入待处理文件路径,并通过接口对任务状态进行统一分发与回传,同时提供可视化界面,便于查看任务轮进度、节点表现与历史统计。

功能概览

  • 批量导入:上传 .txt 文件或粘贴多行文本,每行一个路径。
  • 状态管理:内置"未处理、处理中、已完成、失败"四大队列,节点上报失败或任务超时时将立即进入失败队列。
  • 超时管理:自动定时检查超时任务,可页面配置超时时间和检查间隔,超时的"处理中"任务会被自动标记为失败。
  • 任务查询:支持按任务ID或文件路径查询任务的当前状态。
  • 节点统计:记录各执行节点的处理速度、运行时间等性能数据,自动归档 2 小时前的历史记录,可分页查看。
  • 任务轮完成统计:展示每个任务轮的完成率、累计处理项数、平均耗时等指标;当所有任务轮完成时,可自动向飞书机器人发送汇总通知。
  • 全局概览:控制台顶部汇总全局完成轮次、成功/失败数、累计项数与时间。
  • 调度接口:
    • POST /api/tasks/get_task:按批次分配任务。
    • POST /api/tasks/set_task_status:回传任务执行结果及失败原因。
    • POST /api/tasks/set_processed_info:上报节点处理速度统计。
    • GET /api/tasks/search?query=xxx:查询任务状态。
    • POST /api/tasks/check_timeout:检查并重置超时任务。
  • 数据统计:统计各队列任务数量,支持分页与筛选。
  • UI 控制台:实时刷新任务列表,支持调整每页数量及状态筛选,表格支持一键复制任务ID和路径(带反馈提示)。

环境变量

变量名 默认值 说明
TASK_BATCH_SIZE 10 调度接口默认每批返回的任务数量
TASK_BATCH_MAX 1000 get_task 接口单次最大分发数量上限
TASK_PAGE_SIZE 20 控制台接口默认分页大小
TASK_PAGE_MAX 200 控制台接口允许的最大分页大小
FEISHU_WEBHOOK_URL / LARK_WEBHOOK_URL - (可选)全部任务轮完成时推送通知的飞书/ Lark 机器人地址。可在控制台页面中设置,环境变量仅用于提供默认值。
TASK_TIMEOUT_MS 900000 任务超时时间(毫秒),默认15分钟

可以在根目录创建 .env.local 文件覆盖上述默认值:

TASK_BATCH_SIZE=50
TASK_TIMEOUT_MS=600000

启动项目

pnpm install
pnpm dev

启动后访问 http://localhost:3000。界面支持上传文件、查看队列、刷新统计等操作。

API 接口示例

1. 获取任务(分配任务给节点)

# POST /api/tasks/get_task
curl -X POST http://localhost:3000/api/tasks/get_task \
  -H "Content-Type: application/json" \
  -d '{"batchSize": 50}'

# 返回
[
  {"task_id": "task_xxx", "body": "/path/to/file1.pdf"},
  {"task_id": "task_yyy", "body": "/path/to/file2.pdf"}
]

2. 回传任务状态

# POST /api/tasks/set_task_status
curl -X POST http://localhost:3000/api/tasks/set_task_status \
  -H "Content-Type: application/json" \
  -d '{
    "task_id": "task_xxx",
    "status": true,
    "message": ""
  }'

3. 上报节点处理速度

# POST /api/tasks/set_processed_info
curl -X POST http://localhost:3000/api/tasks/set_processed_info \
  -H "Content-Type: application/json" \
  -d '{
    "node_id": "node-001",
    "item_num": 120,
    "running_time": 45.5
  }'

4. 查询任务状态

# GET /api/tasks/search?query=xxx
curl "http://localhost:3000/api/tasks/search?query=task_xxx"

# 或通过文件路径查询
curl "http://localhost:3000/api/tasks/search?query=/path/to/file1.pdf"

5. 检查超时任务

# POST /api/tasks/check_timeout
curl -X POST http://localhost:3000/api/tasks/check_timeout \
  -H "Content-Type: application/json" \
  -d '{"timeoutMs": 900000}'

6. 分页获取节点统计

# GET /api/tasks/node_stats?page=1&pageSize=10&roundId=round_0001
curl "http://localhost:3000/api/tasks/node_stats?page=1&pageSize=10&roundId=round_0001"

飞书机器人通知配置

当全部任务轮处理完成后,系统会尝试向飞书(或 Lark)机器人发送汇总信息,内容包括成功/失败数量、累计处理项数、节点总耗时及平均耗时等。配置步骤如下:

  1. 在飞书群聊中添加“自定义机器人”,记录生成的 Webhook 地址(形如 https://open.feishu.cn/open-apis/bot/v2/hook/...)。
  2. 打开任务调度控制台,在“批次大小配置”卡片下的“飞书通知配置”中粘贴该地址并点击“保存配置”。若留空则表示关闭通知。
  3. 若希望在首次启动时自动填充该地址,可在 .env.local 中设置 FEISHU_WEBHOOK_URL(或 LARK_WEBHOOK_URL)。页面保存成功后会覆盖该默认值。若机器人开启了安全关键词,请确保通知内容包含对应关键词。

数据存储说明

  • data/rounds/*.json:任务轮快照文件,存储任务队列与节点汇总。
  • data/node-stats.json:节点实时统计快照,独立于任务轮存储。
  • data/node-history/<nodeId>.jsonl:节点行为归档(按行 JSON),保留近 2 小时之外的历史记录。

本 Demo 使用文件存储和进程内数据结构以简化实现,若用于生产环境,请替换为可靠的数据库/消息系统,并补充鉴权与高可用能力。

About

a job manager system. it can easly assign tasks and manage task status

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages