Lambda 是 serverless 万金油,但 15min 上限、冷启动、DLQ、幂等——这些坑要逐个踩。
你给 japanese-climb 新加了话题"日本の祭り",要从 200 个 URL 一次性抓取素材(混着 YouTube 链接和文章页)。每个 URL 处理 5–30 秒,YouTube 还要下音频+Whisper 转写可能 1–2 分钟。搬 AWS 实现一次抓 200 个的 ingest,最对的架构?
🎣 钩子:B 和 C 都能 fan-out 并行,为啥 B 才是"最对"?题目想测什么?
👶 深入浅出 :
sha1(URL) 当 DynamoDB 主键,Lambda 进来先查"处理过没"对应代码:src/jclimb/ingest.py + src/jclimb/source_corpus.py
当前实现:CLI 串行处理 URL,本地 yt-dlp/trafilatura,失败写 ingest.log 继续下一个。单机够用,多用户/大批量崩。
搬 AWS:
aws sqs send-message-batch 批发 200 条消息(每批 10 条,20 次调用)ingest_state 表(PK=sha1(URL)),已存在 + 状态 success 直接跳过s3://japanese-climb/raw/<topic>/<source_id>.txt + 更新 DDB 状态YouTube + Whisper 流程别走 SQS+Lambda——单条 1-2 分钟接近 Lambda 15min 上限的危险区,应该走 Step Functions(下章)。
变体 1:Lambda 处理 SQS 消息成功了但忘了 delete,30 秒后又被另一个 Lambda 实例处理一遍。这是什么问题?怎么避免?
✅ C:即使 FIFO 也有 at-least-once 语义在极少情况下出现,分布式系统永远不能假设 exactly-once。幂等设计是必修课——用 messageId 或业务键去重是事件驱动系统的铁律。B 是治标不治本:调长 timeout 只是减少重投概率,没消除。
变体 2:你的 Lambda 调用 Aurora PostgreSQL,并发 500 时数据库连接数爆了。最合适的修法?
✅ C:经典题型。RDS Proxy 复用连接池(防短连接打爆数据库)是首选;如果数据库写入本身是瓶颈,限流 Lambda 并发也对。生产里两个手段经常一起上。考 AWS 题碰到"A 和 B 都对"要敢选。