分层是为了隔离故障
从设备上报到可查询的数据,中间至少要经过接入认证、格式校验、载荷解析、时序存储与下游分发几个环节。分层不是为了架构好看,而是让某一层的失败不直接传导到其他层:解析失败进死信队列,存储过载时对可丢数据降级,分发失败可以重放。
分层设计要点
| 环节 | 关键设计 | 常见问题 |
|---|---|---|
| 接入认证 | 按设备身份鉴权并限流 | 认证与限流耦合,组件异常时全链路不可用 |
| 格式校验 | 按数据模型校验字段与取值范围 | 不校验时脏数据流入存储,后期清洗代价高 |
| 载荷解析 | 解析失败进死信队列并保留原始报文 | 失败直接丢弃,问题无法复现 |
| 存储写入 | 批量写入加幂等主键 | 逐条写入导致吞吐受限 |
| 下游分发 | 至少一次投递加消费端幂等 | 重复投递未做幂等,统计出现重复计数 |
| 可观测性 | 各层延迟与失败率指标 | 只看端到端指标,无法定位慢在哪一层 |
典型使用场景
- 多接入方式汇聚:不同协议与网络的数据统一进入同一链路
- 峰值削峰:用队列缓冲突发写入,保护后端存储
- 多下游消费:同一份数据分发给存储、告警与实时计算
- 故障复盘:靠死信队列与原始报文还原解析失败的现场
幂等要落在主键设计上:设备标识加工况时间戳作为唯一键,重复写入才能被安全忽略,这比在消费端逐条查重更可靠也更便宜。
把可丢数据与必存数据放在同一条通道上,是接入链路最常见的结构性缺陷:高优先级数据会被低价值流量拖住,过载时一起丢。