Files
Web_BLS_Heartbeat_Server/docs/kafka-heartbeat-producer.md
XuJiacheng eb94aaf92b feat: 升级心跳数据库为高吞吐日分区模型(v2)
- 新增 heartbeat 数据库与表结构文档,描述心跳明细表设计及字段约束。
- 新增 OpenSpec 符合性说明文档,指出与规范的一致点及偏差。
- 新增 Kafka 心跳数据推送说明文档,定义消息格式与推送方式。
- 更新数据库创建脚本,支持 UTF-8 编码与中文排序规则。
- 更新心跳表结构脚本,定义主表及索引,采用 ts_ms 日分区。
- 实现自动分区机制,确保按天创建分区以支持高吞吐写入。
- 添加数据库应用脚本,自动执行 SQL 文件并验证表结构。
- 添加运行时烟雾测试脚本,验证数据库连接与基本操作。
- 添加完整的烟雾测试脚本,验证数据插入与分区创建。
2026-01-12 19:53:27 +08:00

3.1 KiB
Raw Blame History

Kafka 心跳数据推送说明(给数据产生者)

本文档说明数据产生者需要往 Kafka 队列推送的数据结构与推送方式。

1. Topic 与编码

  • Topic默认 bls-heartbeat(以服务端配置为准,见 src/config/config.js
  • 编码UTF-8
  • 建议消息格式JSON便于跨语言对接与灰度演进

注意:当前服务端代码的“二进制解包”尚未实现,若你们已经有既定二进制协议,需要在 Processor 中落地对应解包逻辑,并在本文档补充协议细节。

2. 消息 Key强烈建议

为了保证同设备消息更有序、便于消费端批量聚合:

  • Kafka message key"{hotel_id}:{device_id}"

3. 消息 ValueJSON

3.1 必填字段

下面字段必须提供(否则会被判定为无效数据并丢弃/记录错误):

字段 类型 示例 说明
ts_ms number/int64 1700000000123 毫秒级 epoch 时间戳
hotel_id number/int 12 酒店编号int2 范围内)
room_id number/int 1203 房间编号/房间标识int4
device_id string "A1B2C3D4" 设备唯一 ID序列号/MAC/自定义编码)
ip string "192.168.1.10" IPv4/IPv6 字符串(落库为 inet
power_state number/int 1 取电状态(枚举值需统一标准)
guest_type number/int 0 住客身份(住客/空房/保洁/维修等,枚举值需统一标准)
cardless_state number/int 0 无卡取电/无卡策略状态(枚举)
service_mask number/int64 5 服务/场景位图bigint
pms_state number/int 1 PMS 状态(枚举)
carbon_state number/int 0 碳控状态(枚举)
device_count number/int 1 设备数量/上报设备数(语义需统一)
comm_seq number/int 7 通讯序号(语义需统一)

3.2 可选字段

字段 类型 示例 说明
extra object {"source":"gw","ver":"1.2.3"} 扩展字段:电参、空调状态、版本、上报来源等

4. JSON 示例

{
  "ts_ms": 1700000000123,
  "hotel_id": 12,
  "room_id": 1203,
  "device_id": "A1B2C3D4",
  "ip": "192.168.1.10",
  "power_state": 1,
  "guest_type": 0,
  "cardless_state": 0,
  "service_mask": 5,
  "pms_state": 1,
  "carbon_state": 0,
  "device_count": 1,
  "comm_seq": 7,
  "extra": {
    "source": "gw",
    "ver": "1.2.3",
    "ac": {"mode": 1, "set_temp": 26},
    "meter": {"p": 123.4, "e_wh": 5678}
  }
}

5. 推送方式(实现建议)

  • Producer建议开启压缩lz4/zstd、合理的 batch.sizelinger.ms,以降低单条发送开销
  • 分区:按 key 分区(同设备落同分区)
  • 语义至少一次at-least-once或恰好一次exactly-once取决于你们链路要求服务端需要配合幂等/去重策略(如后续引入唯一键)

6. 与数据库字段的映射

服务端落库目标表:heartbeat.heartbeat_events(位于既有数据库中,默认 log_platform

  • 必填字段:与表字段同名
  • 弹性字段:写入 extrajsonb