互联网工程基本盘(面向“懂一点技术的产品经理”的详述)
你要掌握的不是“能手写所有代码”,而是能在评审/排期/验收时把关键约束说清楚,并能用工程语言把风险提前暴露。下面按你列的四块展开:API 设计、异步任务、数据与埋点、线上稳定性。每块都给你:核心概念、常见坑、PM 该问什么、PRD/验收应写什么。
1) API 设计(REST/JSON、幂等、分页、错误码、鉴权)
1.1 REST/JSON:接口设计的“产品化”
你需要关心的不是 REST 教条,而是:一致性、可理解性、可演进性。
- 资源建模:用名词表示资源,用动词表示动作
- 好:
GET /orders/{id}、POST /orders、POST /orders/{id}/cancel - 容易变烂:
POST /getOrder、POST /doCancelOrder
- 好:
- HTTP 方法语义(用于减少歧义)
GET:只读、可缓存POST:创建/触发动作(非幂等常见)PUT/PATCH:更新(PUT全量,PATCH部分)DELETE:删除
- 版本管理
- 常见:
/v1/...路径版本;或 header 版本 - PM 要求:向后兼容策略(新增字段不破坏旧客户端;避免改字段含义)
- 常见:
PM 该问:
- 这个 API 面向谁(前端/外部客户/内部服务)?SLA 与稳定性要求不同。
- 字段是否有明确含义、单位、枚举值?是否允许为空?默认值是什么?
- 是否支持灰度/多版本客户端共存?老客户端多久淘汰?
1.2 幂等:避免“重复提交/重试导致多扣款、多发货”
幂等:同一个请求调用多次,效果等同于调用一次(至少对业务结果而言)。
- 为什么重要:移动端弱网、网关超时、客户端重发、服务端重试都很常见。
- 典型高风险场景:支付、下单、发券、发货、创建工单、触发异步任务。
常见实现方式(你不必写代码,但要能要求)
- Idempotency-Key(幂等键)
客户端生成唯一 key,服务端用它做去重(缓存/DB 约束)。 - 业务唯一约束
如“同一用户对同一活动只能领一次券”,用唯一索引保证。 - 请求号/去重表
保存请求状态:处理中/成功/失败,重复请求直接返回历史结果。
PM 在 PRD/验收里要写清:
- 哪些接口必须幂等(列出清单)
- 幂等窗口期(例如 24h 去重还是永久去重)
- 重复请求返回什么(同结果?同订单号?同错误码?)
1.3 分页:避免“数据一多就接口炸了/客户端体验差”
分页是典型的“早期不重视,后期重构很痛”。
两种主流分页:
- Offset 分页:
page=1&pageSize=20- 优点:简单
- 缺点:数据量大时性能差;数据变动会造成“翻页重复/漏数据”
- Cursor 分页(推荐用于时间线/列表流):
cursor=xxx&limit=20- 优点:性能更好、稳定
- 缺点:实现复杂;产品需要接受“不是跳页而是顺序翻”
PM 该问:
- 列表会不会很大(10万+)?是否需要 cursor?
- 排序规则是什么(按创建时间?按热度?)是否稳定?
- 是否需要“跳到第 N 页”的能力?如果必须跳页,cursor 可能不合适。
验收点:
pageSize上限(防止被拉爆)- 返回是否包含
hasMore/nextCursor/total(total 很贵,不一定每次都有) - 对新增/删除导致的重复与漏数据是否可接受(需明确)
1.4 错误码:让“失败”可运营、可排障
不要只依赖 HTTP 500/400;要有可机器处理的错误码体系。
建议结构:
- HTTP 状态码:表达大类(401 未认证、403 无权限、429 限流、5xx 服务端故障)
- 业务错误码:表达具体原因(如
ORDER_ALREADY_CANCELED) - message:给人看的提示(可本地化)
- trace_id/request_id:便于排障
PM 该问:
- 哪些错误可以引导用户自助修复(比如参数不合法/权限不足)?
- 哪些错误需要自动重试(超时、依赖服务抖动)?
- 哪些错误必须告警(支付失败率飙升、库存锁失败异常增加)?
1.5 鉴权:你要能把“谁能做什么”说清楚
鉴权不是“加个登录”那么简单,而是权限模型与安全边界。
常见方式:
- 用户登录态(cookie/session/token)
- 服务间鉴权(mTLS、签名、JWT、AK/SK)
- RBAC(角色权限)、ABAC(基于属性,如部门/数据归属)
- 对 AI 场景还要强调:数据权限 + 输出权限 + 操作审计
PM 必备清单:
- 资源归属:数据属于谁?是否跨租户?
- 最小权限:默认不可见、按需授权
- 审计:关键操作要留痕(谁在何时访问/导出/删除)
2) 异步任务(队列、重试、幂等、死信)
2.1 为什么要异步
当一个请求里包含:耗时长、依赖多、可并行、可延后,就适合异步:
- 发邮件/短信、生成报表、视频转码、批量导入、AI 生成长内容、批量 embedding 等。
PM 要明确:
- 用户是否需要“立刻得到结果”?还是“提交后可查询进度”?
- 可接受的时延(秒级/分钟级/小时级)
- 失败如何通知用户(站内信/邮件/重试后再告知)
2.2 队列与重试:可靠性的核心
队列:把“提交任务”和“执行任务”解耦,提升吞吐与稳定性。
重试策略(必须产品化)
- 重试次数与间隔:常用指数退避(1s、2s、4s、8s…)
- 可重试与不可重试的错误分类:
- 可重试:超时、临时网络故障、下游 5xx
- 不可重试:参数非法、权限不足、余额不足(重试没意义)
- 任务超时与取消:用户取消后是否继续跑?资源怎么回收?
PM 该问:
- 这类任务是否可能重复投递?重复执行是否会产生坏结果?(=> 幂等)
- 失败率多少触发告警?积压多少算事故?(=> 可观测+容量)
- 用户如何查看状态?(=> 状态机与可查询)
2.3 幂等与“至少一次投递”的现实
很多消息队列提供的是至少一次(可能重复),因此消费者必须幂等。
常见任务状态机(PM 能读懂、能写进 PRD)
PENDING已创建待执行RUNNING执行中SUCCEEDED成功FAILED_RETRYING失败待重试FAILED终态失败CANCELED取消
验收点:
- 重复提交同一任务不会产生多份结果/多次扣费
- 失败重试不会造成资源泄漏或越滚越大
2.4 死信队列(DLQ):让“怎么都失败的任务”可治理
死信:重试到上限仍失败的消息,进入 DLQ,等待人工/脚本处理。
PM 要求:
- DLQ 有管理后台/报警,能看到失败原因、payload、失败次数
- 有“重放/修复后重试”的机制(运营/工程可操作)
- 记录任务关联用户/订单,便于补偿
3) 数据与埋点(事件模型、指标口径、漏斗、AB)
这是 PM 最该掌握的一块:它决定你能不能用数据闭环驱动迭代。
3.1 事件模型:把“用户行为”变成结构化数据
**事件(event)**通常包含:
- event_name:如
search_submit - user_id / device_id / session_id
- timestamp
- properties:query、入口、实验分组、页面、商品类目等
关键:事件要能还原路径、能做漏斗、能做归因。
PM 常犯错:
- 只埋“曝光/点击”,缺少关键上下文(入口、实验组、query)
- 字段命名混乱、版本迭代随意,导致口径崩坏
- 没有 user_id 贯通(只靠 device_id 导致跨端断裂)
PM 该输出的埋点文档应包含:
- 事件列表(触发时机、是否必埋、是否去重)
- 字段字典(类型、枚举、是否必填、示例)
- 采样策略(全量还是抽样)
- 延迟要求(实时/小时级/天级)
3.2 指标口径:同一个指标只能有一个定义
指标的成功在于“可比较”。口径不统一,团队会陷入无休止争论。
例:转化率到底是?
- 点击到下单?还是曝光到支付?是否去重?窗口期 24h 还是 7d?
PM 要求:
- 指标定义(分子/分母)
- 去重规则(按用户/按 session/按订单)
- 时间窗口(自然日/滚动 24h)
- 过滤条件(剔除风控用户?剔除内部员工?)
- 数据源与延迟(实时看板还是 T+1)
3.3 漏斗:用来定位“掉在哪里”
漏斗是连续步骤:A→B→C。
要能解释“掉”的原因,需要每一步埋点可追踪且有上下文。
验收点:
- 漏斗每步事件都能串起来(同一 session 或同一业务 id)
- 能分维度看(渠道、城市、机型、实验组、新老用户)
- 能定位异常(某机型转化骤降)
3.4 A/B 实验:避免“拍脑袋上线”
你需要会设计最基本的实验体系:
核心要素:
- 实验单元:按用户还是按设备?(影响污染)
- 分桶方式:稳定、可复现(同用户始终同组)
- 主指标 & 护栏指标(guardrail)
- 主指标:你要提升什么(转化、留存、满意度)
- 护栏:不能变差的(崩溃率、延迟、投诉率、成本)
- 样本量与实验周期:至少覆盖工作日/周末差异
AI 功能特别要加:
- 质量指标(准确率、引用正确率、人工评分)
- 成本指标(token/次、平均延迟、失败率)
- 风险指标(幻觉率、违规输出率)
4) 线上稳定性(日志/指标/追踪、告警、容量与限流)
这部分决定“能不能上线、敢不敢扩量”。
4.1 三大可观测性:Logs / Metrics / Traces
日志 Logs:记录“发生了什么”
- 关键:结构化日志(JSON)、包含
request_id/trace_id/user_id - AI 场景要加:模型名、token 输入输出、耗时、检索命中文档数、缓存命中
指标 Metrics:用数字趋势看健康
- QPS、P95/P99 延迟、错误率、超时率
- 队列积压、重试次数、DLQ 数量
- 成本:token/s、每请求成本、缓存命中率
链路追踪 Traces:定位“慢在哪里”
- 一个请求经过网关、服务、DB、向量库、LLM,各段耗时清楚
PM 该问:
- 线上出问题时,能在 10 分钟内定位到哪一段慢/错吗?
- 有没有按接口/渠道/实验组拆分的指标?
- AI 调用失败时,是模型问题、网络问题、还是数据检索问题?
4.2 告警:让问题“可被及时发现”
告警不是越多越好,关键是可行动(actionable)。
- 告警阈值:错误率 > X%、P99 延迟 > Y、DLQ > N、队列积压 > M
- 分级:P0(全挂/资金风险)、P1(核心路径受损)、P2(局部异常)
- 告警必须带:影响范围、开始时间、最近变更、trace/sample
PM 在事故复盘要推动:
- 是否有 SLO(例如 99.9% 可用性、P95<500ms)
- 是否有 runbook(处理手册)
- 是否做到“变更可追踪”(发布版本、配置变更、模型版本)
4.3 容量与限流:防止“流量一来全挂”
容量规划:估算峰值并做压测/预案
- 峰值 QPS、并发数、单请求耗时、资源占用
- 依赖服务容量(DB、向量库、LLM 接口配额)
限流与降级(PM 必须写进方案)
- 限流:每用户/每 IP/每 API key;超过返回 429
- 降级策略:
- 关闭非核心功能(如推荐理由、二次重排)
- 只返回检索结果不生成(RAG 降级)
- 切换小模型或模板回复
- 进入“排队模式”(异步返回)
验收点:
- 明确“核心路径”优先级(哪些必须保,哪些可牺牲)
- 限流后用户体验与提示文案
- 是否支持灰度:小流量先跑、逐步放量
给你一份“可直接套用”的 PRD/技术方案检查表(建议你保存)
API
- 资源路径、方法、请求/响应示例、字段字典
- 幂等策略(哪些接口、key、窗口期、重复返回)
- 分页方案(offset/cursor、上限、排序稳定性)
- 错误码表(可重试/不可重试)
- 鉴权与权限边界、审计需求
异步任务
- 任务状态机、进度查询、取消策略
- 重试次数/间隔/错误分类
- 幂等与去重策略
- DLQ 与重放机制、告警阈值
数据与实验
- 埋点事件清单与字段字典、采样、延迟
- 指标口径(分子/分母/去重/窗口/过滤)
- 漏斗定义与分群维度
- AB:分桶、主指标、护栏指标、周期、样本量估算思路
稳定性
- Logs/Metrics/Traces 最小集
- SLO 与告警策略、runbook
- 容量规划、压测、限流与降级、灰度发布
如果你愿意,我可以结合你正在做的具体功能(例如“AI 客服/RAG 知识库/内容生成/搜索问答”),把以上四块转成一份你项目可直接用的接口草案 + 埋点表 + 指标口径 + 告警阈值建议。你现在的场景是哪一种?