知识卡片
保持调用栈永远向下,避免分布式死锁
内容
同层服务实例互相代理请求(后端A把处理不了的请求转给后端B)看似自然的负载均衡,实则埋下分布式 死锁隐患:若两者共用同一线程池,既要处理对方请求又占用线程等对方回复,双方线程池都打满时就 互相卡死。更稳妥的原则是让调用关系始终单向下沉——前端只调用后端,后端只调用存储层,永不回头; 若某后端选错目标,应直接返回错误,由客户端重试正确目标。发散:这是”避免循环依赖”在动态调用 路径上的体现。
参考来源
- 位置:《SRE:Google运维解密》第22章《处理连锁故障》"保持调用栈永远向下"一节(源文件:_epub-src/OEBPS/Text/0009_0013.xhtml)
- 结论依据:原文明确"这种通信容易导致分布式死锁。后端服务器可能使用同样的线程池来等待发送给其他后端的RPC,以及处理来自其他后端的请求……可能会导致线程耗尽问题的扩散",并给出替代方案"后端不会代理请求给正确的后端,而是通过返回错误使得前端在正确的后端任务上重试它的请求"。
- 原始内容:这种通信容易导致分布式死锁。后端服务器可能使用同样的线程池来等待发送给其他后端的RPC,以及处理来自其他后端的请求。假设后端A的线程池满了,后端B给后端A发送了一个请求,于是占用了后端B的一个线程等待后端A的线程池可用。