编码自检与接口幂等速查
覆盖:提交代码前的 16 条自检清单、接口幂等性 5 种实现方案。后续编码规范类条目直接追加本篇。
一、编码自检清单(提交前过一遍)
| # | 检查项 | 要点 |
|---|---|---|
| 1 | 自测 | 修改完代码记得自测,再小的修改也要测 |
| 2 | 入参校验 | 方法入参尽量都做检验 |
| 3 | 接口兼容 | 修改老接口时,思考接口的兼容性 |
| 4 | 注释 | 复杂的代码逻辑添加清楚的注释 |
| 5 | 资源关闭 | 使用完 IO 资源流需要关闭 |
| 6 | 运行边界 | 采取措施避免运行错误(如数组边界溢出) |
| 7 | 循环内调用 | 尽量不在循环里做远程调用或数据库操作,优先批量 |
| 8 | 并发脑洞 | 写完代码想一下多线程执行会怎样,注意并发一致性 |
| 9 | 判空 | 获取对象属性前,先判断对象是否为空 |
| 10 | 线程池 | 异步优先用恰当的线程池而不是 new Thread(降损耗、提响应、可复用),注意线程池隔离 |
| 11 | SQL 预检 | 手写业务 SQL 先拿去数据库跑一下,并 explain 看执行计划 |
| 12 | 第三方接口 | 调用第三方要考虑异常处理、安全性、超时重试;重要的加签名、加密 |
| 13 | 幂等 | 接口考虑幂等性(详见下节) |
| 14 | 线程安全 | 多线程情况下考虑线程安全问题 |
| 15 | 主从延迟 | 读写分离场景考虑主从延迟的影响 |
| 16 | 缓存 | 考虑缓存与 DB 的一致性,以及缓存穿透、雪崩、击穿 |
sql
-- 第 11 条示例:上线前先看执行计划
explain select * from user where userid = 1;二、接口幂等性 5 种方案
定义:对同一操作执行多次,结果相同且不产生副作用。用于避免重复提交、重试导致的数据不一致。
| 方案 | 做法 | 适用场景 |
|---|---|---|
| 唯一标识符 | 请求携带 UUID,服务端据此判重,已处理则直接返回之前结果 | 通用防重,如订单创建 |
| 版本号 | 接口带版本号,服务端已处理过该版本请求则直接返回 | 接口多版本演进 |
| Token | 服务端预发 Token(或客户端生成唯一串),请求携带,服务端判重 | 表单防重复提交 |
| 乐观锁 | 数据库更新带版本号/时间戳条件,并发更新只有一个成功 | 并发更新同一行数据 |
| 幂等性校验 | 服务端处理前先查是否处理过,未处理则执行并缓存结果供后续请求复用 | 消息消费、回调通知 |
选型提示:
- 防"用户手抖双击" → Token / 唯一标识符
- 防"MQ 重复投递、回调重试" → 幂等性校验(处理记录表)
- 防"并发改同一条数据" → 乐观锁