318 lines
13 KiB
Markdown
318 lines
13 KiB
Markdown
# 数据处理平台架构设计
|
|
|
|
## 目标
|
|
|
|
建设一个通用的数据处理平台,用于接入 FTP/SFTP 等远程数据源,处理压缩包、CSV、XLSX 等报表文件,完成入库、清洗、合并、脚本执行、定时任务和结果查询。平台后续不绑定单一报表类型,容量报表只是一个业务应用或任务模板。
|
|
|
|
当前 CapaReport 项目只作为参考和代码借鉴来源。新平台前期放在当前项目根目录的 `platform/` 目录下开发,该目录已加入 CapaReport 的 `.gitignore`,避免影响当前项目提交。
|
|
|
|
## 设计原则
|
|
|
|
- 只做 Web 平台,不再引入桌面端打包形态。
|
|
- 后端使用 Python,前端使用 Web 技术栈。
|
|
- 模块之间通过明确接口协作,避免一个模块同时承担下载、解析、入库、SQL 执行等多种职责。
|
|
- 每个核心模块独立 Git 仓库维护,平台主仓库通过 submodule 组合。
|
|
- 先保证文件接入、数据入库、任务执行、结果查询这条主链路稳定,再扩展更多报表和自动化能力。
|
|
- 当前阶段避免过度抽象,模块边界清晰即可,插件化能力按真实需求逐步增强。
|
|
|
|
## 仓库与目录组织
|
|
|
|
平台根目录建议为独立 Git 仓库,放在当前项目的 `platform/` 下。本目录不进入 CapaReport 仓库。
|
|
|
|
建议平台主仓库负责:
|
|
|
|
- 应用启动与服务编排。
|
|
- 全局配置、认证、权限、审计、任务调度。
|
|
- 前后端集成。
|
|
- submodule 版本锁定。
|
|
- 平台级文档和部署脚本。
|
|
|
|
建议 submodule 放在平台主仓库的 `modules/` 下:
|
|
|
|
| 模块仓库 | 职责 |
|
|
| --- | --- |
|
|
| `platform-core` | 应用核心模型、配置、任务状态、事件、日志、通用接口约定 |
|
|
| `source-remote` | FTP/SFTP 连接、目录扫描、文件下载、远端删除、连接测试 |
|
|
| `file-processing` | 解压缩、文件识别、CSV/XLSX 读取、字段映射、数据标准化、临时文件管理 |
|
|
| `database-service` | 数据库连接、库表管理、数据入库策略、SQL 执行、结果查询、导出 |
|
|
| `job-runner` | 手动任务、定时任务、脚本任务、任务依赖、失败重试、运行历史 |
|
|
| `web-ui` | Web 界面、配置管理、任务监控、数据管理、脚本管理、API 文档 |
|
|
| `api-client-contracts` | 前后端共享的 API 契约、类型约定、错误码和响应结构 |
|
|
|
|
早期可以减少仓库数量,例如先保留 `platform-core`、`source-remote`、`file-processing`、`database-service`、`web-ui` 五个模块。等脚本和调度复杂度上来后,再把 `job-runner` 独立出去。
|
|
|
|
## 模块职责
|
|
|
|
### 平台核心模块
|
|
|
|
平台核心模块只负责平台级能力,不处理具体业务数据。
|
|
|
|
核心职责:
|
|
|
|
- 任务、运行记录、数据源、数据集、文件、脚本、调度计划等基础模型。
|
|
- 统一日志、错误码、状态流转和事件通知。
|
|
- 配置读取、配置校验、敏感信息存储策略。
|
|
- 模块注册和服务发现。
|
|
- 认证、Token、权限、审计的基础接口。
|
|
|
|
不应承担:
|
|
|
|
- FTP/SFTP 协议细节。
|
|
- CSV/XLSX 解析细节。
|
|
- 具体数据库 SQL 方言。
|
|
- 具体业务报表规则。
|
|
|
|
### FTP/SFTP 模块
|
|
|
|
远程数据源模块只负责“远程文件发现和传输”。
|
|
|
|
核心职责:
|
|
|
|
- FTP/SFTP 连接配置、测试、目录递归扫描。
|
|
- 远程文件列表、文件大小、修改时间、文件名时间范围识别辅助信息。
|
|
- 按规则下载文件和目录。
|
|
- 下载完成后的远端源文件删除,只删除文件不删除目录。
|
|
- 网络异常、断连、重试、超时控制。
|
|
|
|
不应承担:
|
|
|
|
- 解压缩。
|
|
- CSV/XLSX 字段解析。
|
|
- 数据入库。
|
|
- SQL 脚本执行。
|
|
|
|
### 文件处理模块
|
|
|
|
文件处理模块负责把原始文件转成“可入库的数据批次”。
|
|
|
|
核心职责:
|
|
|
|
- ZIP 等压缩包解压,保留原始数据和清理临时展开文件。
|
|
- CSV/XLSX 文件识别、编码识别、Sheet 过滤、表头识别。
|
|
- 字段映射、类型转换、空值和异常值标准化。
|
|
- 文件名日期解析、按目录选择最近 N 天或目标周期数据。
|
|
- 生成数据批次元信息,例如来源文件、字段列表、行数、日期范围、目标逻辑表。
|
|
- 为数据库模块提供流式或分块数据输入。
|
|
|
|
不应承担:
|
|
|
|
- 真实数据库连接管理。
|
|
- 建表、删表、查表。
|
|
- SQL 脚本执行。
|
|
- 结果表查询。
|
|
|
|
### 数据库模块
|
|
|
|
数据库模块负责“数据库侧”的所有能力。
|
|
|
|
核心职责:
|
|
|
|
- 数据库连接配置、连接池、连接测试。
|
|
- 数据库、表、字段、索引管理。
|
|
- 数据入库策略:批量插入、数据库原生加载、临时表、落地中间文件。
|
|
- SQL 脚本执行、SQL 查询、结果分页、结果导出。
|
|
- 表结构查看、表数据管理、权限控制下的数据修改。
|
|
- 多数据库适配的接口预留,早期以 MySQL 为主。
|
|
|
|
数据入库边界建议:
|
|
|
|
- 文件处理模块负责解析、清洗、标准化和分批输出。
|
|
- 数据库模块负责选择入库方式并执行入库。
|
|
- 业务任务模块只编排“先处理文件,再入库,再执行脚本”,不直接操作底层文件或数据库细节。
|
|
|
|
性能取舍:
|
|
|
|
- 大 CSV 优先走数据库原生批量加载能力。
|
|
- 原生加载不可用时使用分块批量插入。
|
|
- XLSX 不应整文件无脑载入内存,优先采用流式读取或按 Sheet 分块处理。
|
|
- 大任务必须有进度、行数、速度、当前阶段和失败定位。
|
|
|
|
### 任务与脚本模块
|
|
|
|
任务模块负责“什么时候做、做什么、做到哪一步”。
|
|
|
|
核心职责:
|
|
|
|
- 手动上传处理、远程下载处理、定时扫描处理。
|
|
- SQL 脚本、Python 脚本和后续其他脚本类型的执行入口。
|
|
- 任务状态、阶段、日志、运行历史、失败重试。
|
|
- 调度策略:按小时扫描、按文件日期判断就绪、就绪后延迟触发。
|
|
- 任务互斥、取消、超时、异常恢复。
|
|
|
|
任务模块不直接解析文件,也不直接写数据库底层逻辑,只调用文件处理模块和数据库模块。
|
|
|
|
### Web 界面模块
|
|
|
|
Web 界面模块负责平台交互,不包含业务处理逻辑。
|
|
|
|
核心页面建议:
|
|
|
|
- 数据源配置:FTP/SFTP、连接测试、远端目录、删除源文件策略。
|
|
- 文件处理配置:Sheet 过滤、字段映射、文件日期规则、目标表规则。
|
|
- 数据库配置:连接、库表管理、数据查询、导出、SQL 执行。
|
|
- 任务中心:手动运行、远程运行、定时任务、运行历史、日志。
|
|
- 脚本中心:SQL/Python 脚本编辑、版本、执行记录。
|
|
- API Token 与 API 文档。
|
|
- 系统设置:用户、权限、历史保留、平台运行参数。
|
|
|
|
界面模块只调用 API,不直接耦合后端模块内部实现。
|
|
|
|
## 核心数据流
|
|
|
|
平台主链路建议分为以下阶段:
|
|
|
|
1. 数据源扫描:远程模块返回文件清单和基础元信息。
|
|
2. 数据选择:任务模块根据调度规则和文件日期规则选择待处理文件。
|
|
3. 数据获取:远程模块下载文件,形成原始数据目录。
|
|
4. 文件展开:文件处理模块解压压缩包并识别 CSV/XLSX。
|
|
5. 数据标准化:文件处理模块完成编码、字段、类型、空值、异常值处理。
|
|
6. 数据入库:数据库模块按入库策略写入目标库表。
|
|
7. 脚本处理:任务模块调用数据库模块执行 SQL 或调用脚本执行器。
|
|
8. 结果输出:数据库模块提供结果表查询、导出和 API 查询。
|
|
9. 历史归档:任务模块记录原始数据、日志、结果、运行耗时和错误信息。
|
|
10. 清理策略:按配置清理临时文件、历史记录和远端源文件。
|
|
|
|
## 关键模型
|
|
|
|
建议平台统一维护以下概念:
|
|
|
|
| 模型 | 含义 |
|
|
| --- | --- |
|
|
| 数据源 | FTP/SFTP、本地目录或未来其他来源 |
|
|
| 文件清单 | 一次扫描得到的远程或本地文件列表 |
|
|
| 数据集 | 一批准备处理的数据,可以来自上传或远程下载 |
|
|
| 处理配置 | 字段映射、Sheet 过滤、文件日期规则、目标表规则 |
|
|
| 任务 | 一次手动或自动触发的处理动作 |
|
|
| 运行记录 | 任务的一次实际运行,包含状态、阶段、日志、耗时 |
|
|
| 数据批次 | 文件处理模块输出给数据库模块的标准化数据 |
|
|
| 脚本 | SQL、Python 或其他脚本类型 |
|
|
| 结果资源 | 结果表、导出文件、日志、原始数据归档 |
|
|
|
|
## 配置设计
|
|
|
|
配置应分层:
|
|
|
|
- 平台配置:端口、认证、历史保留、日志、存储目录。
|
|
- 数据源配置:协议、地址、端口、账号、目录、超时、删除源文件策略。
|
|
- 文件处理配置:文件类型、压缩包规则、字段映射、日期解析、异常值策略。
|
|
- 数据库配置:连接、目标库、入库策略、表名前缀、大小写兼容。
|
|
- 任务配置:调度周期、目标日期规则、失败重试、并发限制。
|
|
- 脚本配置:脚本类型、执行环境、参数、权限。
|
|
|
|
敏感配置可以先支持明文内网部署,后续再增加加密存储或密钥管理。
|
|
|
|
## API 设计方向
|
|
|
|
API 应按资源分组,而不是按页面分组。
|
|
|
|
建议资源:
|
|
|
|
- 数据源 API。
|
|
- 文件与数据集 API。
|
|
- 数据库 API。
|
|
- 任务 API。
|
|
- 脚本 API。
|
|
- 历史 API。
|
|
- Token 与用户 API。
|
|
- 系统配置 API。
|
|
|
|
外部系统接入时优先通过 Token 调用任务和查询 API。API 文档应自动生成,并为常用接口提供中文说明、参数示例和错误说明。
|
|
|
|
## 调度设计
|
|
|
|
调度不应依赖服务器系统时间判断数据是否已经推送完成,应优先依据文件名中的数据日期或文件清单中的业务日期。
|
|
|
|
建议支持:
|
|
|
|
- 每隔固定时间扫描远程目录。
|
|
- 按目录判断目标日期是否齐全。
|
|
- 空目录可配置为停推目录并跳过。
|
|
- 日粒度和周粒度文件按文件名自动识别。
|
|
- 就绪后先写入就绪标识,下一轮扫描再触发处理,避免刚推送完成时立即下载半成品。
|
|
- 处理成功后按配置删除远端源文件,并清除就绪标识。
|
|
|
|
日粒度与周粒度规则必须配置化,避免不同目录、不同厂家、不同报表命名习惯互相影响。
|
|
|
|
## 存储与历史
|
|
|
|
建议保留以下目录概念:
|
|
|
|
- 原始数据目录:保存下载或上传的原始文件。
|
|
- 临时处理目录:保存解压后的 CSV/XLSX、中间转换文件。
|
|
- 归档目录:保存可追溯的任务原始数据和日志。
|
|
- 导出目录:保存临时导出文件,下载完成后自动清理。
|
|
- 脚本目录:保存 SQL、Python 等脚本。
|
|
|
|
处理历史应支持:
|
|
|
|
- 查看任务详情、阶段、日志。
|
|
- 下载完整原始数据包。
|
|
- 单文件或单目录下载。
|
|
- 按保留次数或保留天数清理。
|
|
- 清理临时文件但不误删原始归档。
|
|
|
|
## 当前项目可复用经验
|
|
|
|
当前 CapaReport 可作为参考的能力:
|
|
|
|
- FTP/SFTP 下载、远程删除、连接测试。
|
|
- 文件名日期解析和最近 N 天筛选。
|
|
- ZIP 解压、CSV/XLSX 处理、字段映射。
|
|
- MySQL 表管理、数据查询、CSV/XLSX 导出。
|
|
- SQL 脚本执行和日志展示。
|
|
- 处理历史、原始数据下载、临时文件清理。
|
|
- API Token、OpenAPI 文档、Web 管理界面。
|
|
- 自动调度的就绪标识和二次触发机制。
|
|
|
|
迁移时应避免直接复制成一个巨型模块,应先按职责拆分,再逐步搬运可复用逻辑。
|
|
|
|
## 开发路线
|
|
|
|
### 阶段一:平台骨架
|
|
|
|
- 建立 `platform/` 独立仓库。
|
|
- 明确模块 submodule 目录。
|
|
- 建立后端 Web 服务、前端壳、基础认证、配置读写。
|
|
- 接入一个最小远程数据源配置和连接测试。
|
|
|
|
### 阶段二:文件到数据库主链路
|
|
|
|
- 完成远程下载、本地上传、解压、CSV/XLSX 识别。
|
|
- 完成字段映射和基础类型转换。
|
|
- 完成 MySQL 入库、表管理、数据查询。
|
|
- 建立任务状态、日志和历史记录。
|
|
|
|
### 阶段三:脚本与调度
|
|
|
|
- 支持 SQL 脚本执行。
|
|
- 支持定时扫描远程目录。
|
|
- 支持按目录和日期判断数据就绪。
|
|
- 支持处理成功后删除远端源文件。
|
|
|
|
### 阶段四:业务模板化
|
|
|
|
- 将容量报表作为一个业务模板接入平台。
|
|
- 增加更多报表模板和处理脚本。
|
|
- 支持任务参数、脚本参数、结果表配置。
|
|
|
|
### 阶段五:平台增强
|
|
|
|
- 增加权限细分、审计、任务重试、告警。
|
|
- 增加更多数据库适配。
|
|
- 增加模块版本管理和升级策略。
|
|
|
|
## 风险与决策点
|
|
|
|
| 风险 | 建议 |
|
|
| --- | --- |
|
|
| 模块拆得太细导致开发慢 | 早期只拆核心边界,复杂后再独立仓库 |
|
|
| 文件处理和数据库入库职责混乱 | 坚持文件模块输出标准数据批次,数据库模块负责落库 |
|
|
| 大文件处理性能不足 | 优先流式、分块、数据库原生批量加载 |
|
|
| 不同报表命名规则不一致 | 日期解析和周期规则配置化 |
|
|
| 脚本权限风险 | 脚本执行入口必须有权限控制和审计记录 |
|
|
| submodule 管理复杂 | 主仓库锁版本,模块仓库保持独立发布说明 |
|
|
|
|
## 近期建议
|
|
|
|
先在 `platform/` 下建立独立平台主仓库,再从 CapaReport 中抽取最小可用能力:远程连接测试、文件日期解析、CSV 入库、任务日志。第一版不要急着覆盖所有报表,先跑通“远程目录到数据库结果表”的稳定链路。
|