4.3 KiB
id, title, type, domain, stack, tags, level, related, week
| id | title | type | domain | stack | tags | level | related | week | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| backend.data-pipeline.interview | 数据管道面试题 | interview | backend |
|
|
intermediate |
|
|
数据管道面试题
基础
【基础】批处理和流处理的区别?
参考答案:批处理按时间间隔处理一批数据,延迟高、实现简单,适合报表和对账;流处理事件到达即处理,延迟低,适合实时同步和告警。常结合使用:流处理保证实时,批处理兜底对账。
追问:知识库文档更新后同步到向量库用哪种?→ 一般用事件驱动(流式)保证及时,再加每日对账修复遗漏。
【基础】什么是幂等?同步任务怎么做到幂等?
参考答案:同一操作执行多次与执行一次结果相同。做法:按业务主键 upsert;写入时比较版本号或更新时间;用唯一约束防止重复;外部副作用(发通知)记录已处理的 id。
追问:为什么还要比较版本?→ 重试和乱序可能让旧数据后到,直接覆盖会把新状态改回旧状态。
【基础】哪些错误应该重试?
参考答案:临时性错误:超时、连接失败、5xx、429;不应该重试:认证失败、权限不足、参数错误等 4xx。重试要有上限、指数退避和抖动,429 遵守 Retry-After。
追问:为什么要加抖动?→ 避免大量客户端在同一时刻重试造成“惊群”,把恢复中的服务再次打垮。
进阶
【进阶】增量同步的水位线怎么设计?
参考答案:使用 (更新时间, 主键) 组合,按这个顺序分页拉取;本批数据成功落库后在同一事务中推进水位线;处理迟到数据时回拉一个重叠窗口,依赖幂等写入去重;定期对账兜底。
追问:来源没有更新时间字段怎么办?→ 使用来源的自增 id / 变更日志 / CDC;都没有就只能定期全量比对(按哈希或汇总比较)。
【进阶】怎么保证数据质量?
参考答案:字段级校验(类型、必填、枚举、范围),坏数据进死信并保留原文;批次级检查(数量波动、空值率、唯一性);与源头对账(数量、金额汇总);异常时停止写入并告警;为质量规则写测试。
追问:校验失败的数据怎么处理?→ 进入死信表,修复规则或上游后重新处理;比例超阈值整批回滚,避免污染下游。
【进阶】多个工作进程调用同一个限流的第三方接口,怎么控制?
参考答案:使用集中式限流:Redis 令牌桶 / 滑动窗口(Lua 脚本保证原子),按配额维度(平台 + 应用 / 商家)计数;拿不到令牌就等待或重新入队;监控 429 比例动态调整。
追问:令牌桶和漏桶的区别?→ 令牌桶允许一定突发(桶内有积累的令牌);漏桶以固定速率输出,更平滑。
场景题
【场景题】同步脚本中途挂掉,重跑后出现重复数据和漏数据,你怎么改?
参考答案:引入水位线(落库成功后才推进)、幂等 upsert + 版本比较、重叠窗口处理迟到数据、单商家任务互斥、坏数据死信、批次质量检查和对账告警。详见第三方订单同步场景和示例代码。
追问:怎么验证修好了?→ 写测试:重复执行结果不变、中途失败后续跑不丢数据、旧版本不覆盖新版本、质量检查不通过时回滚。
【场景题】RAG 知识库需要每天从多个来源(网盘、Wiki、工单系统)采集文档,你怎么设计管道?
参考答案:每个来源一个连接器,按增量(修改时间 / 变更 API)拉取;统一处理流程:解析 → 清洗 → 分块 → 嵌入 → 写入向量库 / ES(按文档 id + 分块序号幂等);删除和权限变更同步;嵌入接口限流和重试;记录每个文档的处理状态和版本;失败进死信可重试;质量检查(解析失败率、空文档、重复率);对账确认来源和索引一致。
追问:嵌入模型升级怎么办?→ 新建索引用新模型全量重建,评估通过后切换别名,旧索引保留回滚。