feat: 移除服务中的运行时代码数据库初始化与分区维护逻辑,外部化相关功能并新增 SQL 脚本支持

This commit is contained in:
2026-03-04 11:49:20 +08:00
parent 3b98c6239b
commit f59000f5ef
4 changed files with 28 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
# Change: Remove runtime DB bootstrap from service
## Why
当前服务进程同时承担了“业务消费写入”和“数据库建库/分区维护”两类职责,导致部署耦合、运维边界不清晰,且难以被其他程序复用。
本次变更将建库与分区维护彻底外部化,服务进程只保留 Kafka → 处理 → 写库主链路。
## What Changes
- 从运行时代码中移除启动建表、建函数、建索引、定时分区维护逻辑。
- 移除运行时相关开关配置(`DB_INIT_AND_PARTITION_ENABLED``DB_PARTITION_*`)。
- 在仓库根目录新增 `SQL_Script/`,提供可由外部程序调用的 SQL/JS 脚本:
- `01_init_schema.sql`
- `02_create_partitions.sql`
- `run_init.js`
- `run_ensure_partitions.js`
- 保留写入失败时“缺分区”兜底:按批次时间范围调用 `heartbeat.ensure_partitions` 后重试(前提是外部初始化已部署函数)。
## Impact
- Affected specs: `db`
- Affected code:
- `src/db/databaseManager.js`
- `src/config/config.js`
- `src/config/config.example.js`
- `.env`
- `.env.example`
- `SQL_Script/*`
- Operational impact:
- **BREAKING (运维流程层面)**:首次部署或升级后,需先执行 `SQL_Script` 初始化脚本,再启动服务。

View File

@@ -0,0 +1,29 @@
## ADDED Requirements
### Requirement: 服务运行时不得承担建库与定时分区维护
系统 MUST 仅负责数据库连接与业务写入,不在服务启动时执行数据库结构初始化,也不在进程内执行定时分区维护。
#### Scenario: 服务启动仅建立连接
- **WHEN** 服务进程启动并连接 PostgreSQL
- **THEN** 系统应只创建连接池并完成连通性检测
- **AND** 不应在运行时执行表/索引/函数等 DDL 初始化
- **AND** 不应在进程内启动分区维护定时任务
#### Scenario: 写入遇到缺分区时的运行时兜底
- **WHEN** 批量写入 `heartbeat.heartbeat_events` 遇到缺分区错误
- **THEN** 系统应基于该批次的时间范围调用 `heartbeat.ensure_partitions`
- **AND** 调用后应重试当前批次写入
- **AND** 系统不应在运行时创建或替换数据库 schema 对象
### Requirement: 建库与分区维护能力必须以外部脚本提供
系统 MUST 在仓库根目录 `SQL_Script/` 提供可被外部程序调用的建库/分区维护脚本。
#### Scenario: 提供初始化脚本
- **WHEN** 运维或其他程序需要初始化数据库结构
- **THEN** 应可使用 `SQL_Script/01_init_schema.sql``SQL_Script/run_init.js`
- **AND** 脚本应支持幂等重复执行
#### Scenario: 提供分区预创建脚本
- **WHEN** 运维或外部调度需要预创建分区
- **THEN** 应可使用 `SQL_Script/02_create_partitions.sql``SQL_Script/run_ensure_partitions.js`
- **AND** 无需启动主服务进程即可执行分区维护

View File

@@ -0,0 +1,6 @@
## 1. Implementation
- [x] 1.1 新增根目录 `SQL_Script/`,提供建库与分区预创建 SQL/JS 脚本。
- [x] 1.2 删除运行时服务中的建表、建函数、建索引与定时分区维护逻辑。
- [x] 1.3 删除运行时配置中的初始化/分区维护开关字段。
- [x] 1.4 保留缺分区写入兜底:基于批次时间范围调用 `heartbeat.ensure_partitions` 后重试。
- [x] 1.5 执行构建验证,确保主服务可正常打包。