feat: 实现Redis集成与Kafka消息处理优化

- 新增Redis集成模块,支持心跳写入与控制台日志队列
- 优化Kafka消费者实现,支持多实例与自动重连
- 改进消息处理器,支持批量处理与多层解码
- 更新数据库表结构,调整字段类型与约束
- 添加Redis与Kafka的配置项和环境变量支持
- 补充测试用例和文档说明
This commit is contained in:
2026-01-14 17:58:45 +08:00
parent eb94aaf92b
commit 910f1c353f
28 changed files with 1691 additions and 177 deletions

View File

@@ -1,9 +1,12 @@
# 数据库操作规范
## 需求
## Purpose
本规范定义本服务对 PostgreSQL 的连接池配置、表结构初始化(含分区表)、分区预创建维护策略、批量写入与约束错误处理等行为。
## Requirements
### Requirement: 数据库连接管理
系统必须能够建立和维护与PostgreSQL数据库的连接。
系统 MUST 能够建立和维护与 PostgreSQL 数据库的连接。
#### Scenario: 成功连接数据库
- **WHEN** 系统启动时
@@ -16,7 +19,7 @@
- **AND** 重连失败时应该记录错误日志
### Requirement: 心跳数据写入
系统必须能够将处理后的心跳数据写入PostgreSQL数据库。
系统 MUST 能够将处理后的心跳数据写入 PostgreSQL 数据库。
#### Scenario: 写入单条心跳数据
- **WHEN** 接收到单条处理后的心跳数据时
@@ -29,7 +32,7 @@
- **AND** 提高写入效率
### Requirement: 数据完整性保障
系统必须保障写入数据库的心跳数据完整性。
系统 MUST 保障写入数据库的心跳数据完整性。
#### Scenario: 事务管理
- **WHEN** 写入多条相关数据时
@@ -43,7 +46,7 @@
- **AND** 根据配置决定是否重试
### Requirement: 数据库表结构管理
系统必须包含数据库表结构的定义和管理机制。
系统 MUST 提供数据库表结构的定义和管理机制。
#### Scenario: 表结构初始化
- **WHEN** 系统首次启动时
@@ -62,7 +65,7 @@
- **AND** 不影响现有数据
### Requirement: 数据查询支持
系统必须支持基本的数据查询操作,用于监控和调试。
系统 MUST 支持基本的数据查询操作,用于监控和调试。
#### Scenario: 查询最新心跳数据
- **WHEN** 需要查询最新的心跳数据时

View File

@@ -1,9 +1,12 @@
# Kafka消息处理规范
## 需求
## Purpose
本规范定义本服务如何连接 Kafka 集群、订阅主题并消费消息(以 buffer 形式透传 payload以及错误处理/重连与消费确认语义。
## Requirements
### Requirement: Kafka连接管理
系统必须能够建立和维护与Kafka集群的连接。
系统 MUST 能够建立和维护与 Kafka 集群的连接。
#### Scenario: 成功连接Kafka集群
- **WHEN** 系统启动时
@@ -16,19 +19,24 @@
- **AND** 重连失败时应该记录错误日志
### Requirement: 心跳消息消费
系统必须能够消费Kafka队列中的心跳消息。
系统 MUST 能够消费 Kafka 队列中的心跳消息。
#### Scenario: 消费心跳消息
- **WHEN** Kafka队列中有心跳消息时
- **THEN** 系统应该消费该消息
- **AND** 将消息传递给处理器进行解包
#### Scenario: 二进制 payload 透传
- **WHEN** Kafka 消息 value 可能为二进制压缩数据(非纯文本)
- **THEN** Consumer 应使用 buffer 方式接收 value/key
- **AND** 将原始 buffer 交由 Processor 执行解码/解压与反序列化
#### Scenario: 消息消费确认
- **WHEN** 消息处理完成后
- **THEN** 系统应该向Kafka确认消息已消费
### Requirement: 消息过滤与路由
系统必须能够根据消息类型过滤和路由心跳消息。
系统 MUST 能够根据消息类型过滤和路由心跳消息。
#### Scenario: 过滤无效消息
- **WHEN** 接收到无效格式的消息时

View File

@@ -1,9 +1,25 @@
# 数据处理器规范
## 需求
## Purpose
本规范定义心跳处理器对 Kafka 消息 value 的解码/解压(含两层以内组合)、字段校验、转换为分区表写入结构,以及批量写库与失败丢弃/记录策略。
## Requirements
### Requirement: 心跳数据解包
系统必须能够解包Kafka消息中的二进制心跳数据。
系统 MUST 能够解包 Kafka 消息中的心跳数据。
#### Scenario: 支持常见编码/压缩(两层以内)
- **WHEN** Kafka 消息 value 为下列任意形式时:
- UTF-8 JSON对象或数组
- base64(二进制)
- gzip / deflate(zlib) / deflate(raw) / brotli 压缩后的二进制
- **THEN** 系统应当按“最多两层”的策略尝试解码/解压
- **AND** 成功时应还原为 JSON 对象或数组
- **AND** 失败时应记录错误并丢弃该消息
#### Scenario: 支持包装结构
- **WHEN** 解包得到的 JSON 为包装结构(例如包含 `data`/`payload`/`body` 字段)
- **THEN** 系统应优先提取其中的对象作为心跳数据源
#### Scenario: 解包有效心跳数据
- **WHEN** 接收到有效格式的Kafka心跳消息时
@@ -16,7 +32,7 @@
- **AND** 记录错误日志
### Requirement: 心跳数据验证
系统必须能够验证解包后的心跳数据有效性。
系统 MUST 能够验证解包后的心跳数据有效性。
#### Scenario: 验证有效心跳数据
- **WHEN** 解包后的心跳数据格式正确且字段完整时
@@ -30,7 +46,7 @@
- **AND** 丢弃该数据
### Requirement: 心跳数据转换
系统必须能够将解包后的心跳数据转换为数据库存储格式。
系统 MUST 能够将解包后的心跳数据转换为数据库存储格式。
#### Scenario: 转换心跳数据格式
- **WHEN** 心跳数据验证通过时
@@ -38,9 +54,13 @@
- **AND** 添加必要的元数据
### Requirement: 批量处理支持
系统必须支持批量处理心跳数据,提高处理效率。
系统 MUST 支持批量处理心跳数据,提高处理效率。
#### Scenario: 批量处理心跳数据
- **WHEN** 接收到大量心跳消息时
- **THEN** 系统应该将数据分批处理
- **AND** 每批处理的数量可配置
#### Scenario: Kafka 单条消息携带批量心跳
- **WHEN** Kafka 消息 value 为 JSON 数组(批量心跳)
- **THEN** 系统应将数组内每条心跳作为独立项进入批处理队列

View File

@@ -0,0 +1,33 @@
# Redis 对接规范
## Purpose
本规范定义本服务按协议向 Redis 写入“项目心跳”(STRING) 与“项目控制台”(LIST) 两个 key 的数据结构与频率,并在 Redis 不可用时保持无人值守可用性(不阻塞启动、后台重连)。
## Requirements
### Requirement: 心跳 Key 写入
系统 MUST 按协议周期性写入 Redis STRING 心跳 Key。
#### Scenario: 定期刷新心跳
- **WHEN** 服务运行中
- **THEN** 系统应每 3 秒(可配置)执行一次 `SET ${projectName}_项目心跳 <json>`
- **AND** JSON 必须包含 `apiBaseUrl``lastActiveAt`(毫秒时间戳)
- **AND** value 使用 UTF-8 编码
- **AND** 可选设置 TTL例如 EX 30
### Requirement: 控制台日志队列写入
系统 MUST 按协议向 Redis LIST 追加控制台日志。
#### Scenario: 追加日志
- **WHEN** 发生关键事件(启动成功/错误/连接状态变化)
- **THEN** 系统应执行 `RPUSH ${projectName}_项目控制台 <json>`
- **AND** JSON 必须包含 `timestamp`(ISO-8601)、`level``message`
- **AND** `level` 建议取值 `info|warn|error|debug`
### Requirement: Redis 异常处理
系统 MUST 在 Redis 不可用时进行后台重连,且不得阻塞主服务启动。
#### Scenario: Redis 连接中断
- **WHEN** Redis 连接中断
- **THEN** 系统应自动重连
- **AND** 不应导致主进程崩溃