项目一: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 必须回答¶
- 在线是怎样定义的?
- Redis 保存事实还是查询视图?
- 为什么使用 Set/ZSet/TTL?
- 系统最可能先在哪里遇到瓶颈?
- 实际压测规模是多少?