架构风格与模式58 条

请求-响应模式

调用方发起请求并等待响应,是最直观的交互方式;实现简单、语义清晰,但调用双方在时间与可用性上耦合,需要超时、重试与熔断配套。

请求-响应是什么

请求-响应是最直观的交互模式:调用方发起请求并等待响应。实现简单、语义清晰、便于调试与追踪,代价是双方在时间与可用性上紧耦合:下游慢,上游线程就跟着等;下游不可用,上游很快跟着失败。

配套手段

同步调用必须配齐超时、重试、熔断与降级,否则一次下游抖动会顺着调用链放大成全局故障。同步链路每增加一跳,延迟叠加与失败概率都会上升,因此关键链路要控制跳数,长耗时动作优先改成异步处理。

基本信息

适用读操作、需要即时结果的交互、低延迟链路
同步开销调用链路过长时延迟叠加,故障向上传播
配套手段超时、重试退避、熔断、降级
超时分解入口 1000ms,服务 A 800ms,服务 B 500ms,逐级留出处理与网络余量

关键设计点

  • 超时:按下游 P99 加余量设定,外层超时大于内层之和
  • 重试:仅限幂等操作,指数退避加随机抖动,并限制次数
  • 熔断:错误率超阈值快速失败,保护线程与连接资源
  • 降级:预置默认值或返回缓存旧值,维持核心路径可用
  • 隔离:按下游拆分线程池或信号量,避免连锁阻塞

可用性怎么算

串行同步调用的可用性约等于各环节可用性相乘:三个可用性均为 99.9% 的下游串起来,整体可用性降到约 99.7%,即每月多出两小时不可用。这也是同步链路必须控制跳数的量化理由。相比之下,异步消息把下游可用性从请求路径上移开,代价是结果不再即时返回。

同步链路每增加一跳都会放大整体延迟与失败概率;关键链路应控制跳数,把批量与广播类场景交给发布订阅。
读多写少且需要即时反馈的场景适合同步;如果一次请求要通知十个下游,用同步循环调用得到的可用性约等于各下游可用性相乘,通常低到无法接受。

易错点

  • 没有超时设置,上游线程被慢下游拖死,线程池瞬间耗尽
  • 多层都做重试,放大效应使下游在故障时收到成倍流量
  • 对非幂等操作重试,产生重复下单或重复扣款
  • 同步链路层层嵌套,一次请求跨十几个同步调用,尾延迟彻底失控
  • 外内层超时设置倒挂,内层比外层还长,外层提前放弃而内层任务继续执行

数据来源与参考

  • 《Enterprise Integration Patterns》(Hohpe & Woolf)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌