API 组合与聚合

对多个下游服务的数据做组合查询(内存连接或编排调用)后返回;组合层要定义部分失败语义:整体失败还是带缺省结果,需要按业务场景确定。

什么是 API 组合与聚合

API 组合指在聚合层对多个下游服务的数据做并行调用、内存拼接后一次性返回,常见于 BFF、网关或聚合服务。它减少客户端往返次数、屏蔽后端拆分细节,但也把部分失败语义与性能预算的复杂度转移到聚合层:关键字段缺失该整体失败还是给默认值,必须在设计阶段确定。

基本信息

实现形态并行调用多个下游,在内存中按业务键拼接结果
失败语义关键数据缺失整体失败;非关键缺失给默认值并标记不完整
性能要点并行化、超时预算分配、避免按行循环调用(N+1 放大)
常用手段批量接口、并发控制、结果缓存与降级开关

部分失败语义设计

数据类型缺失时的行为说明
关键字段(金额、状态)整体失败,返回错误业务无法在缺字段时给出正确结果
增强字段(头像、标签)给默认值并标记结果不完整提升体验但不影响主流程
列表次要字段省略字段,整体仍成功客户端按可选字段处理
下游整体超时快速失败并提示稍后重试避免长时间占用聚合层资源

典型使用场景

  • 移动端首页:一次请求聚合推荐、订单概览与未读消息,减少往返
  • 订单详情:并行取订单、支付与物流状态,拼成一个响应
  • BFF 层:按前端页面需要组合多个后端服务,屏蔽服务拆分
  • 第三方对接:把内部多服务能力包装成单一稳定接口
  • 性能优化:把串行调用改为并行,缩短端到端响应时间
  • 降级设计:下游不可用时按字段重要性给出部分结果

并行聚合与超时预算(示意)

并行聚合与超时预算(示意)
# 聚合层调用示意
总预算:500ms
  订单服务   超时 200ms   关键字段
  支付服务   超时 200ms   关键字段
  推荐服务   超时 150ms   非关键,失败即跳过
# 规则
- 先批量获取再拼接,禁止按行循环调用下游(避免 N+1)
- 关键字段任一失败即整体失败;非关键失败不阻塞主流程
- 记录每个下游的耗时与失败率,作为预算调整依据
- 缓存可复用的公共数据,减少重复调用
组合层容易出现 N+1 放大:先批量拉取再在内存拼接,或使用下游提供的批量接口,避免逐条调用。
未定义部分失败语义时,前端会拿到残缺数据却无法判断是「本来没有」还是「取失败了」,只能显示错误或空白。

易错点

  • 循环逐条调用下游,延迟随数据量线性增长,批量场景直接超时
  • 未定义部分失败语义,前端拿到残缺数据无法区分空值与失败
  • 聚合层无超时预算,某个下游变慢会拖垮整个响应
  • 把聚合逻辑散落在多个调用方,各端实现不一致,维护成本翻倍

数据来源与参考

  • microservices.io:API Composition
  • 《Microservices Patterns》(Richardson)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌