跳转至

项目一:IoT 设备状态服务

项目目标

实现一个可运行的状态服务,模拟设备心跳,提供单设备状态、分页列表、在线统计和状态历史。

最小架构

设备模拟器
→ MQTT Broker
→ Status Worker
  ├→ Redis:last_seen、在线集合
  ├→ PostgreSQL:设备、状态迁移历史
  └→ Metrics
→ HTTP API

里程碑一:正确性

  • 设备每 10 秒心跳;
  • 超过 30 秒离线;
  • 重复心跳不重复上线;
  • 快速重连不会被旧离线任务覆盖;
  • 状态迁移写入历史。

验收:

  • 100 台模拟设备稳定运行
  • 重复心跳不会增加在线数
  • 停止设备后在容忍窗口内离线
  • 重连后状态最终为 online

里程碑二:查询

API:

GET /devices/{id}/status
GET /devices?cursor=&limit=100
GET /stats/online
GET /devices/{id}/status-history

验收:

  • 页面查询只读取一页
  • Redis 使用批量读取
  • 在线统计不扫描全部设备
  • 租户条件不会遗漏

里程碑三:故障

主动注入:

  • Redis 重启;
  • Worker 重启;
  • MQTT 重复消息;
  • 设备时间错误;
  • 20% 设备同时重连;
  • 数据库变慢。

验收:

  • 系统能恢复或明确降级
  • 有错误日志和指标
  • 统计可以重新校准
  • 没有无限重试

里程碑四:可观测性

指标:

  • 当前在线设备;
  • 心跳处理速率;
  • 心跳到状态更新延迟;
  • 状态迁移数量;
  • 离线判断延迟;
  • Redis/数据库错误;
  • 消息积压。

README 必须回答

  1. 在线是怎样定义的?
  2. Redis 保存事实还是查询视图?
  3. 为什么使用 Set/ZSet/TTL?
  4. 系统最可能先在哪里遇到瓶颈?
  5. 实际压测规模是多少?