后端Backend
前端点了「提交订单」,校验、算库存、写库这些事到底在哪一层做?出了错算谁的?
美式拿铁 × 1 · ¥32
提交订单库存 12 → 11 · 已鉴权
结论:用户只看见「已下单」,后厨才真正验身份、扣库存、写库。
前端点了「提交订单」,校验、算库存、写库这些事到底在哪一层做?出了错算谁的?
美式拿铁 × 1 · ¥32
提交订单库存 12 → 11 · 已鉴权
结论:用户只看见「已下单」,后厨才真正验身份、扣库存、写库。
后端代码部署到哪?跑起来监听端口、对外应答的是谁?挂了怎么办?
server-01接流量 · 已处理 3
server-02宕机摘流
结论:同一份程序跑在多台机器上;这台挂了,另一台接着答。
刷新或重启之后,订单为什么有的还在、有的就丢了?数据到底存在哪?
结论:落在表里的行,重启还能读到;只写在内存便利贴上的会丢。
前端点保存之后,数据是怎么送到后面、又怎样知道成功还是失败的?
{ "id": 184, "total": 32 }结论:约定好怎么问、怎么答;方法加路径是一次调用,状态码加 JSON 是结果。
接口为什么有的写成 DELETE /articles/7,有的写成 POST /deleteArticle?哪种更好读?
DELETE · 柜子是空的
结论:同一地址加不同动作,操作同一份资源;结果看状态码,不把动词塞进路径。
为什么有人说 GraphQL 一次就能拿到标题和作者,还不会把用不到的字段捎回来?
回卡:REST 资源建模 · 林晓
views / avatar 未请求,不返回结论:一次问清要的字段,不多不少;嵌套作者也在同一张回卡里。
客户端不想每分钟问支付好没好,怎么让事件一来就主动通知我?
POST · evt_184 · ¥32
结论:对方主动推过来,不用反复问「好了吗」;同一封再来也不会重复入账。
缓存命中率很高,可有人刚改了数据,别人看到的还是旧的——缓存到底什么时候算过期?
REST 资源建模
结论:纸条还在就秒回;空了才回柜取。改了源却不撕,就会读到旧版。
流量一大接口就被慢任务拖垮,任务失败也没人重试——怎么把提交和处理拆开?
#417 已 ack · #418 #419 #420 还挂着
结论:投递即可走;消费成功才摘票。慢了就先挂着,不会悄悄丢。
列表接口一次返回太多太慢,分页后又有新数据插进来,翻页时为什么会看到重复或漏行?
结论:用游标锚定这一页;按页码跳,插入新动态就会重复或漏行。
“网址开头的 http 到底是什么?前端发的请求和服务器回的响应,到底各长什么样?”
GET /users/42 HTTP/1.1HTTP/1.1 200 OK{ "id": "42" }一次 HTTP 交换 = 请求 + 响应;每条消息都是「起始行 · 头部 · 空行 · 主体」。
“一个 HTTP 请求到底由什么组成?方法、路径、请求头和请求体是怎么拼成一条可发送的消息的?”
POST /api/favorites HTTP/1.1Content-Type: application/jsonAuthorization: Bearer …{"item_id":"p_7"}请求 = 请求行 + 头 + 空行 + 可选体;方法说意图,路径说目标,头携带元信息。
“接口返回的结果由什么组成?为什么有的 200 带数据,前端却要自己判 success:false 才知道失败?”
HTTP/1.1 200 OKContent-Type: application/json{ data: […], error: null }响应 = 状态行 + 头 + 空行 + 可选体;状态码定语义,2xx 带 data、4xx/5xx 带 error。
“HTTP 头部不是无意义的键值堆:它是起始行之后、空行之前那一段元信息,请求响应都有;读错一个字段就可能泄密或串缓存。”
接口返回的 200、404、500 到底在说什么,前端该按它做什么?
首位 2= 成功类别,客户端继续读取结果
陷阱200 只代表请求完成,不等于业务成功;别用 200 把失败塞进响应体。
“Set-Cookie 只是开始:浏览器按主机、路径、HTTPS、同站四道门决定是否自动携带,HttpOnly 只挡脚本读取,Max-Age=0 立即删除。”
「浏览器带着 Origin 提问,服务端用 Access-Control-* 回答;只有浏览器判定允许,网页脚本才能读取跨来源响应。」
请求发出去了但没等到响应:是断网、超时还是被取消?它和 500 是一回事吗?
先保留输入,再按请求副作用(读 / 写)选择恢复动作。
访问一个链接,服务器返 404——它是说「出错了」「没权限」还是「这东西找不到」?
/users/9999服务器找不到这个资源 → 前端切到空状态,给返回入口。
不是 5xx 出错 · 不是 403 没权限 · 不是 410 已删除
接口返了 4xx,到底是哪里错了、要不要重试、改什么才能过?
重试原样重发还会失败;只有 408 超时、429 限流才退避重试。
接口返 500、502、503、504 到底是哪儿坏了,我该重试还是等着?
首位 5= 服务器自己出了问题,请求没错;通常瞬时,退避后重试可能成功。
对照看到状态码 = 请求已到达服务端;根本没连上、没收到码 = network-error。
为什么有时要我登录,有时登录了还进不去?
你现在是访客。点一下看系统怎么拦。
点进详情可对照三种结果:未登录 / 没权限 / 允许
“点了登录之后到底发生了什么?为什么连错几次就被锁?登录成功后,下一个请求怎么就知道是我?”
“登录之后每个请求都认识我,退出到底删的是什么?”
“服务器不查数据库就认识我,靠的是我手里这段字符串;它被偷了或我想立刻下线怎么办?”
对照 session:服务端查记录可即时删;token 靠签名,撤销只能用短 exp + 黑名单,且 payload 是 base64 可读(不是加密)。
“每加一个人都得重新勾一遍权限,能不能按岗位一次性给对、走的人一把收回?”
登录进去了,为什么这条数据我能看、却不能删?没给的按钮直接没了,我到底有没有权?
“密码不是该加密存吗?为啥文档总说要哈希?HTTPS 又到底保护了什么?”
hello@example.comenc:a1b9f3…可逆 · 有密钥就能还原sha256:7f3a9c…单向 · 靠重哈希验证(≠ 加密)非对称换会话钥传输混合保护“登录接口被人疯狂试密码怎么办?限流到底限的是什么?超限之后客户端又该做什么?”
“前端没拦,后端也没验,脏数据直接写进数据库,半夜被 500 告警叫醒。”
/api/signupreq_7f2若不校验直接放行 → 脏数据落库 · 业务逻辑崩溃 500。
“代码出错了直接 catch 掉?还是把错误甩给用户看?”
同一个错误,处理方式决定用户看到什么和系统能不能查。
「用户连点支付、网络抖动重发了一次,接口怎么保证不扣两次钱?」
同一个 key 再发,服务端返回第一次的结果,不重复扣款。
POST 默认不幂等:没有 key 时,第 2 次会再扣 ¥100。「代码在本地能跑,上了生产就报错;密钥到底该放哪、为什么换个环境配置就全乱?」
密钥永远不进 git · 只进环境变量
「代码在本地能跑,怎么变成用户能打开的网站?上线出了问题能立刻退吗?」
策略决定「炸多大、能不能立刻退」· 每个实例靠健康检查放行,失败就回滚到上一版
“线上出错了却两眼一抹黑——日志该写什么、不该写什么?”
结论:等级 + requestId 串起一次请求;明文密码=泄漏,对照正确写法 password=***。
“半夜接口挂了,为什么是用户先发现?仪表盘和告警到底该看哪个、该报哪个指标?”
生产表要加字段、改名字——怎么改才不会锁表,也不会让正在跑的代码挂掉?
“让它每天凌晨两点自动清理过期链接——这条时间表达式怎么写?跑挂了谁知道、跑得比一天还久怎么办?”
「缩略图生成阻塞主请求,后台进度、失败原因和安全重试都不可见。」
请求秒返 202,缩略图在worker 后台逐帧生成;进度可查、失败退避重试、3 次后进死信。
“HTTP 一问一答就断了,聊天和协同编辑那种服务器随时主动推、客户端也随时发的效果,到底靠什么实现?”
对照:HTTP 每问一次都要重新连接;WebSocket 握手一次后保持一条双向通道,结果就是实时聊天、协同与推送都能做。
远处地区的用户打开站点,图片转圈、白屏很久——CDN 怎么让资源到他们手里快一点?
对照看:同一张图,离你近的边缘命中就近秒回;别的地区第一次仍要回源——结论是 CDN 把副本搬到离用户近的地方,不是把内容变少。