feat: 实现Redis集成与Kafka消息处理优化
- 新增Redis集成模块,支持心跳写入与控制台日志队列 - 优化Kafka消费者实现,支持多实例与自动重连 - 改进消息处理器,支持批量处理与多层解码 - 更新数据库表结构,调整字段类型与约束 - 添加Redis与Kafka的配置项和环境变量支持 - 补充测试用例和文档说明
This commit is contained in:
@@ -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** 需要查询最新的心跳数据时
|
||||
|
||||
@@ -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** 接收到无效格式的消息时
|
||||
|
||||
@@ -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** 系统应将数组内每条心跳作为独立项进入批处理队列
|
||||
|
||||
33
openspec/specs/redis/spec.md
Normal file
33
openspec/specs/redis/spec.md
Normal 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** 不应导致主进程崩溃
|
||||
Reference in New Issue
Block a user