← 中文资源

简体中文版本

限制 GraphQL 查询复杂度

按字段权重与列表乘数计算查询成本,对超出预算者直接拒绝,并在执行前返回清晰错误。

阅读英文原文

概述

深嵌套查询一旦叠加列表乘数,成本会呈指数级增长,仅靠深度限制无法发现宽扇出。以静态成本模型在解析阶段拦截,可把昂贵的查询挡在解析器之外。

关键步骤

  1. 为标量字段赋成本,为列表字段赋乘数。
  2. 执行前计算总复杂度,超预算即拒绝。
  3. 返回包含限制与计算值的结构化错误。
  4. 处处分页,使列表乘数有界。

验证

  • 超预算查询在进入解析器前被拒绝。
  • 错误信息给出计算成本与限制。
  • 合法查询正常运行。
  • 列表查询成本有界。

注意事项

  • 静态复杂度是近似值,可能高估或低估真实成本。
  • 必须依据生产流量调参,否则会误伤合法查询或漏放滥用。

适用范围

本条目围绕「限制 GraphQL 查询复杂度」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。

const cost = calculateComplexity(query, fieldWeights);
if (cost > BUDGET) {
  throw new GraphQLError(`Query too complex: ${cost} > ${BUDGET}`);
}