GraphQL 是一个用于 API 的查询语言和运行时环境,它可以让客户端精确地调用需要的数据。GraphQL 的特点在于它具有强大的数据获取和查询特性,但在使用过程中,可能会出现性能问题。本文将介绍一些 GraphQL 中的性能调优方案,旨在让开发者更好地解决性能问题。
1. 消除 N + 1 查询问题
GraphQL 的类型系统和查询语句都显式地声明了客户端请求中的字段。这使得客户端能够仅请求所需数据,避免了 REST API 中经常出现的 Over-fetching 和 Under-fetching 问题。但如果只是简单地定义字段而不处理其下级字段,就有可能出现 N + 1 查询问题。
N + 1 查询问题是指,当查询中包含一个集合(比如说图书馆系统的检索书籍)和集合中元素的数量(比如书的作者)时。为每个集合元素都发出一次类似“查询作者”的请求,会导致查询的数量变成了 N + 1,其中 N 是集合元素数量。
解决 N + 1 查询问题的方法主要分为以下两种:
手动加载
手动加载是一种比较简单的方式,就是手动指定需要一起加载的查询请求并指定字段。例如下面的代码:
----- ----- - ----- -- -- - ----- ----- - ----- ----------- ----- ------- - ----- ------------ -------------- -- ------------------------- -- ------ ---------------- ------ -- -- -------- ------- -------------- ---- -
数据加载器
手动加载虽然方便,但对于复杂的 GraphQL 查询来说,这种方式可能会显得非常冗长且难以维护。因此,我们需要一种更智能且易于使用的方法,数据加载器(Data Loader)就是其中之一。
数据加载器是一个缓存查询请求并在需要时进行批处理的工具。它可以再查询时自动捆绑相同分类的查询请求,从而减少他们的数量。对于每个类型定义单独配置一个数据加载器,例如下面的代码:
----- ------------- - ---- -- -------------------- ----- ------------ - --- ---------------- ------ -- - ----- ------- - ----- ------------------------------------- ------ -------- --- ----- --------- - - ----- - ------- ------ -- - ------ --------------------------------- - - --
这个数据加载器能够根据需要批量加载作者信息获取 GraphQL 查询性能的显著提升。
2. 利用启发式缓存
GraphQL 的查询引擎可以利用启发式缓存,它可以在运行时检测出来重复请求,并从缓存中返回相同的结果。因为 GraphQL 查询是纯函数式的,因此可以根据查询文本作为键来缓存查询结果。
启发式缓存是一种相对较新的缓存机制,它的优点是对于查询文本的精确缓存,同时不会出现缓存污染和有过多扩展性的问题,这也使得它成为一个适用于 GraphQL 查询和 mutation 的很好的解决方案。
3. 合理使用代理服务
用代理服务主要是考虑有些GraphQL查询可能会涉及到多个不同的数据源,而这些数据源可能处于不同的技术栈和部署环境下,需要用到 RESTful API 等外部API来應對这种多重数据源的情况。这种情况下,可以考虑使用 GraphQL API Gateways。它可以应用此特性汇总多个 GraphQL 服务接口,提供一致的 GraphQL 查询接口,将这些 API 融合进一个中心数据门户,从而解决不同数据源操作之间的复杂性。
结论
GraphQL 提供了一个很好的解决方案来处理 API 的过度或欠缺的查询问题。在设计数据库 Schema 时,要注意避免 N + 1 查询的问题,合理使用数据加载器来进行魔法提高查询性能,通过缓存机制,或者结合 API Gateway 解决代理接口问题。以上这些技术是可重用的,不仅可以用于GraphQL API,也可以用于其他API。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670f03f95f5512810262aaa5