39 lines
1.2 KiB
Markdown
39 lines
1.2 KiB
Markdown
|
|
# OpenSpec Proposal: bls-oldrcu-heartbeat-backend
|
|||
|
|
|
|||
|
|
## 功能概述
|
|||
|
|
从 Kafka topic `blwlog4Nodejs-oldrcu-heartbeat-topic` 消费 OldRCU 心跳数据,
|
|||
|
|
经过去重与批处理后,upsert 写入 PostgreSQL G5 库的 `room_status.room_status_moment_g5` 表。
|
|||
|
|
|
|||
|
|
## 数据流
|
|||
|
|
```
|
|||
|
|
Kafka (blwlog4Nodejs-oldrcu-heartbeat-topic)
|
|||
|
|
↓ 消费消息
|
|||
|
|
Message Parser (提取 ts_ms, hotel_id, room_id, device_id)
|
|||
|
|
↓ 投入缓冲
|
|||
|
|
HeartbeatBuffer (Map, key=hotel_id:room_id, 每5秒flush)
|
|||
|
|
↓ 批量写库
|
|||
|
|
PostgreSQL G5 (room_status.room_status_moment_g5)
|
|||
|
|
→ INSERT ON CONFLICT (hotel_id, room_id) DO UPDATE
|
|||
|
|
→ SET ts_ms, device_id, online_status=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 关键约束
|
|||
|
|
- **写库频率**:每5秒最多写一次
|
|||
|
|
- **去重策略**:同一 hotel_id+room_id 只保留 ts_ms 最大的记录
|
|||
|
|
- **online_status**:每次写库强制置为 1
|
|||
|
|
|
|||
|
|
## npm 依赖
|
|||
|
|
| 包名 | 版本策略 | 用途 |
|
|||
|
|
|------|----------|------|
|
|||
|
|
| kafka-node | ^5.0.0 | Kafka 消费 |
|
|||
|
|
| pg | ^8.11.5 | PostgreSQL 连接池 |
|
|||
|
|
| redis | ^4.6.13 | Redis 心跳/日志 |
|
|||
|
|
| dotenv | ^16.4.5 | 环境变量 |
|
|||
|
|
| node-cron | ^4.2.1 | 定时指标上报 |
|
|||
|
|
| zod | ^4.3.6 | 消息Schema校验 |
|
|||
|
|
|
|||
|
|
## 目标数据库表
|
|||
|
|
- Schema: `room_status`
|
|||
|
|
- Table: `room_status_moment_g5`
|
|||
|
|
- PK: `(hotel_id, room_id)`
|