“2026任务系统 0406”这名字一看就知道是某个任务管理平台的项目代号:2026是指标目标年份,0406多半是版本迭代日或者里程碑编号。做这类系统最头疼的不是功能写不出来,而是任务状态一多、流转一复杂,后面全是坑。我今年做的一套内部任务系统正好也是这个命名风格,从需求梳理、表结构设计到调度器、消息通知、数据看板完整走了一遍,踩了不少雷,也沉淀了一套可以复用的方案。这篇文章我把整个设计和落地过程掰开揉碎讲清楚,包括关键SQL、调度策略、幂等处理、优先级算法,以及线上出问题时的排查思路。适合正在做任务系统、工单系统、自动化调度平台的后端开发,也适合刚接手类似项目的同学拿去做参考。
1. 内容整体设计与思路拆解
1.1 核心需求解析:不是“做个列表”那么简单
很多团队一提“任务系统”,第一反应就是“搞个表,存任务,前端列表展示就行”。真这么做,三个月后必重构。任务系统的本质是状态机 + 调度引擎 + 消息管道 + 数据闭环,列表只是最外层表现。
我梳理需求时习惯先问四个问题:
- 任务是谁创建的?人工创建、系统自动生成、还是外部系统推送?
- 任务状态有哪些?每种状态由谁推进?需要什么条件才能流转?
- 任务卡住怎么办?超时、失败、依赖不满足,是重试、跳过还是转人工?
- 任务结果怎么用?不仅要完成,还要统计耗时、成功率、瓶颈环节。
以“2026任务系统 0406”这个版本为例,核心业务场景有三个:
- 周期性巡检任务:每天凌晨自动生成,分发给不同负责人,要求在当天18点前完成。
- 外部工单接入:第三方系统通过API推送任务,本系统负责解析、去重、分配、回传结果。
- 人工补录任务:运营人员在后台手动创建临时任务,设置截止时间和优先级。
这三个场景对系统的要求完全不同。周期性任务要稳定触发,外部工单要抗住突发流量,人工补录则要处理各种不合理的截止时间。设计时必须把这些差异抽象成统一模型,否则代码里全是if else。
1.2 技术选型背后的取舍逻辑
这套系统我用了Spring Boot 3作为主框架,数据库选了PostgreSQL,缓存用Redis,任务调度用自研的基于数据库轮询加分布式锁的方案,没有引入XXL-Job或ElasticJob。
为什么这么选?不是说那些开源调度器不好,而是当前场景有特殊性:
- 任务量不算极端(日均几千到几万条),数据库轮询完全扛得住;
- 任务状态和业务数据强相关,很多调度判断需要实时查库,直接操作数据库反而简单;
- 团队对Java技术栈最熟,维护成本最低。
如果用ElasticJob,虽然分区和弹性伸缩做得更好,但引入一套额外的ZK依赖和运维成本,对当前规模来说属于过度设计。
数据库选PostgreSQL是因为任务表需要大量状态更新和条件查询,PG的约束和索引能力比MySQL更顺手,尤其是部分唯一索引和复杂条件索引,在防止重复任务、加速状态统计时非常好用。
前端部分没有用重型框架,直接Vue 3加Element Plus,因为任务系统的交互核心是表格、表单、看板,不需要复杂拖拽,这个组合开发效率最高。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计与数据模型
2.1 任务主表的字段设计要点
任务表是整个系统的地基,字段设计直接决定后续开发是顺滑还是痛苦。我最终落地的核心表结构大致如下:
sql复制CREATE TABLE task (
id BIGSERIAL PRIMARY KEY,
task_no VARCHAR(64) NOT NULL,
title VARCHAR(256) NOT NULL,
task_type VARCHAR(32) NOT NULL,
priority SMALLINT NOT NULL DEFAULT 4,
status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
assignee_id BIGINT,
assignee_name VARCHAR(64),
creator_id BIGINT NOT NULL,
creator_name VARCHAR(64) NOT NULL,
source_system VARCHAR(32),
plan_start_time TIMESTAMPTZ
