为什么自己搭一条管道
最初我只是想拿到稳定的业务指标与结果数据,用于后续的分析实验。现成的接口要么结构不合用,要么字段语义含糊,与其反复适配别人的格式,不如把原始数据拉下来,按自己的标准重新组织一遍。这条管道跑通之后,所有下游分析都建立在同一套字段口径上,省掉了大量对齐成本。
多源接入
接入层的核心问题不是「怎么发请求」,而是「怎么面对结构完全不同的数据源」:
- 有的源返回 JSON,字段命名是下划线风格;有的返回 HTML,需要写选择器去抽取。
- 数据的更新节奏不同,有的每天一轮,有的实时更新。
- 同一条记录在不同源里的标识可能不一致。
我把每个源写成独立的接入器,各自负责认证、翻页、原始响应落盘。接入器之间互不感知,新增一个源只需要实现同一个接口,不需要改动其他部分。
限流与重试
真正跑起来之后,遇到最多的是 429 和偶发的 5xx。我的处理方式比较朴素:
- 每个接入器自带速率配置,请求之间保持固定间隔,宁可慢一点也不触发限流。
- 收到 429 时优先读取响应头里的等待时间,没有就按指数退避;连续失败超过阈值则放弃本轮,下一轮再补。
- 所有写入都带幂等键,重试不会产生重复数据。
关键是把「暂时失败」和「永久失败」区分开:前者值得重试,后者重试一百次也没有意义,只会拖慢整轮处理。
结构化处理
原始数据落盘后进入处理阶段。这一步没有高深技术,全是琐碎的规则:
- 名称归一:同一个实体在不同源里的写法不一致,维护一张别名映射表,全部映射到标准名。
- 时间处理:统一转成 UTC 存储,展示层再按需转换,避免时区带来的错位。
- 字段校验:数值必须合法,枚举值必须落在允许范围内,不符合的记录进异常表人工复核。
归一化是所有环节里最花时间的一段,但回报也最直接:下游不需要再关心数据来自哪个源。
暂存到标准表
处理后的数据先进暂存表,再由一个合并任务写入标准表。两段式设计让「获取」和「入库」解耦:
- 处理中断时,暂存表里已经获取的部分不会丢。
- 合并任务按自然主键做 upsert,重复获取不产生副作用。
- 标准表结构变更时,可以重放暂存表里的历史数据重建。
小结
这条管道没有用什么框架,就是标准库加几个脚本,胜在每一环的行为都可预测、可观测。以上内容仅供技术交流参考。