RPC 的最大陷阱是把远程调用伪装成本地调用,让人忘记网络的不可靠性。常见坑:
- 把网络当可靠:延迟、丢包、分区是常态,不设置超时会导致线程/连接堆积,故障雪崩。每个 RPC 必须有明确超时。
- 重试引发重复:超时可能只是响应丢了,请求其实成功了——直接重试造成重复扣款,必须配合幂等设计(幂等键、去重表)。
- 重试风暴:层层服务各自重试,流量指数放大,需要重试预算、退避与熔断。
- 级联延迟:同步链路上最慢的服务决定整体延迟,要关注尾部延迟(p99),而非平均值。
- 契约与版本演进:接口增删字段破坏旧客户端,需要兼容策略与契约测试。
- 序列化成本与限制:大对象、循环引用、时区与精度问题在跨语言时尤其坑。
- 分布式调试难:没有统一 trace id,问题定位如同大海捞针。
应对要点:超时 + 有限重试 + 幂等 + 熔断降级 + 契约管理 + 全链路追踪。底层认知来自分布式计算谬误——网络不是可靠、零延迟、无限带宽的。