phase 5 part 3: mongodb, elasticsearch hybrid search, data-pipeline, nodejs BFF topics with verified examples

This commit is contained in:
Shikui Wang committed 2026-10-23 16:38:52 +08:00
1 parent 9eeb10aede
commit 075872e31e
27 files changed
+2405 -52

No files matched your search

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