监控体系架构设计:分层架构与核心选型
做埋点数据质量监控,第一步不是写代码,而是想清楚架构。我见过太多团队,上来就搭 Kafka、写 Flink 任务,结果跑了一个月发现数据对不上,又回头补链路——说白了,就是没把分层想明白。
今天咱们就把这件事聊透。我会从分层架构讲起,再聊核心组件怎么选,最后给出一份技术栈对比清单。嗯,这些都是我在真实项目中踩过坑之后沉淀下来的东西。
为什么一定要分层?
你想想看,埋点数据从用户点击到最终报表展示,中间要经过多少环节?采集、传输、清洗、存储、计算、应用……任何一个环节出问题,你都得从头排查。不分层的话,排查起来就像在一团乱麻里找线头。
我个人习惯把整个体系拆成四层:采集层、传输层、存储层、应用层。每层只干自己的事,层与层之间通过标准接口对接。这样出了问题,我一眼就能定位到是哪一层。
核心原则:每层职责单一,层间解耦,异常隔离。这是整个监控体系的基石。
采集层:数据入口的守门员
采集层是整个体系的起点。数据从这里进来,如果质量不过关,后面再怎么折腾也是白费。我在项目中遇到过最典型的问题:SDK 版本不一致,导致同一事件在不同端上报的字段名都不一样。
采集层要干三件事:
- SDK 埋点采集:客户端(App、Web、小程序)通过 SDK 上报事件
- 服务端日志采集:后端服务通过日志或 RPC 上报业务事件
- 数据接入网关:统一接收所有上报数据,做初步校验和格式标准化
我的经验:在网关层做一次 Schema 校验非常有必要。我曾经接手过一个项目,客户端上报的字段类型跟约定完全不一致——说好的整型传成了字符串,导致下游解析全崩。加一层校验,能拦住 80% 的低级错误。
传输层:数据的高速公路
传输层解决的是数据怎么从采集端安全、可靠地到达存储端。说白了,就是一条高速公路。车多了要排队,路坏了要绕行,这些都得在传输层处理好。
我个人习惯用消息队列做缓冲削峰。为什么?因为埋点数据的流量特征很不均匀——白天是晚上的好几倍,大促期间更是平时的几十倍。没有缓冲层,存储层直接被打爆。
传输层的关键能力:
- 消息队列:Kafka / Pulsar,负责数据缓冲和分发
- 实时流处理:Flink / Spark Streaming,做实时质量检测
- 数据分发:按事件类型、优先级路由到不同下游
注意:传输层最容易忽略的是背压处理。如果下游处理速度跟不上上游生产速度,消息队列的积压会越来越大。我曾经见过一个项目,Kafka 积压了 3 天的数据,等恢复消费时,实时监控已经变成了「历史回顾」。
存储层:数据的仓库
存储层要解决一个核心矛盾:埋点数据量大(每天几十亿条),但查询要求快(秒级响应)。单一存储方案很难同时满足这两个需求。
我的做法是分层存储:
| 存储类型 | 存储内容 | 选型建议 | 保留周期 |
|---|---|---|---|
| 明细存储 | 原始埋点数据 | HDFS / S3 + Parquet | 30 天 |
| 指标存储 | 聚合后的质量指标 | ClickHouse / Doris | 90 天 |
| 异常事件存储 | 质量异常记录 | Elasticsearch | 180 天 |
| 元数据存储 | 事件定义、Schema 信息 | MySQL / PostgreSQL | 永久 |
你可能会问:为什么不用一套存储搞定?嗯,我之前也这么想过,结果发现 ClickHouse 查明细太慢,ES 做聚合又太贵。分开存,各取所长,才是务实的选择。
应用层:让数据说话
应用层是面向用户的。不管底层多复杂,用户只关心两件事:数据质量怎么样?出问题了通知谁?
应用层主要包含:
- 质量看板:实时展示数据质量大盘,包括上报量、缺失率、异常率等
- 告警通知:当质量指标触发阈值时,通过钉钉、企微、邮件等方式通知责任人
- 数据报表:日报、周报、月报,定期输出质量报告
- 自助分析:支持按事件、维度、时间范围灵活查询质量数据
关键点:应用层要「快」和「准」。快是指从数据产生到看板展示,延迟控制在分钟级。准是指告警不能误报,也不能漏报。我见过一个项目,告警一天响几百次,最后运维直接把告警群屏蔽了——这就失去了监控的意义。
核心组件选型与技术栈对比
选型这件事,没有银弹。每个公司的技术栈、团队能力、业务场景都不一样。我只能说说我自己的经验,以及在不同场景下的取舍。
先看一张对比表:
| 层级 | 组件 | 优势 | 劣势 | 我的推荐场景 |
|---|---|---|---|---|
| 采集层 | 自研 SDK | 灵活可控,可定制 | 开发成本高,维护难 | 大厂、有专门客户端团队 |
| 开源 SDK(如 Sensors Analytics) | 开箱即用,社区成熟 | 定制能力有限 | 中小团队、快速上线 | |
| 传输层 | Kafka | 吞吐高,生态好 | 运维复杂,延迟略高 | 日均亿级以上数据量 |
| Pulsar | 延迟低,支持多租户 | 社区相对小 | 对延迟敏感的场景 | |
| 存储层 | ClickHouse | 查询极快,压缩比高 | 不支持事务,更新成本高 | 指标存储、实时查询 |
| Elasticsearch | 全文检索强,适合日志 | 聚合性能一般,存储成本高 | 异常事件存储、明细检索 | |
| 应用层 | Grafana | 可视化强,插件丰富 | 告警能力弱 | 看板展示 |
| 自研告警中心 | 灵活配置,集成方便 | 开发工作量大 | 告警规则复杂的场景 |
我的建议:不要为了技术而技术。如果你的数据量每天只有几百万条,用 MySQL + 定时任务都能搞定,没必要上 Flink + Kafka。选型的第一原则是「够用就好」,等业务量上来了再升级。
技术栈组合推荐
最后,我给出三套常见的组合方案,供你参考:
- 轻量级方案(日均千万级):自研 SDK + Nginx + MySQL + Grafana。适合初创团队,成本低,维护简单。
- 标准方案(日均亿级):开源 SDK + Kafka + Flink + ClickHouse + ES + Grafana。这是目前大多数中型公司的标配。
- 重型方案(日均十亿级以上):自研 SDK + Pulsar + Flink + HDFS + ClickHouse + ES + 自研告警中心。适合大厂,对延迟和定制化要求高。