优化细粒度GraphQL访问控制和查询性能

GraphQL既是用于API的查询语言,也是用于执行这些查询与现有数据的运行时。它提供了API中可用数据的全面和清晰描述,允许客户端精确请求他们所需的内容而没有多余的内容,促进了API随时间的演变,并支持强大的开发者工具。

GraphQL访问控制和查询优化

访问控制

授权是一组规则或业务逻辑,用于确定用户、会话或上下文是否具有访问控制列表(ACL)以执行特定操作或查看特定数据。

此类行为应该在业务逻辑层执行。尽管直接在 GraphQL 层中放置授权逻辑可能很诱人,但通常更适合在其他地方处理。

查询优化

优化GraphQL查询涉及技术,如最小化不必要的数据获取和处理,以提高响应时间并减少服务器负载。这将导致更高效的应用程序,提供更好的用户体验、增强用户参与度和留存率,以及增加服务器的可伸缩性。

优化GraphQL查询的方法

  • N+1(批量加载)
  • 过度获取和不足获取
  • 缓存以减少延迟
  • 分页

增强GraphQL访问控制和GraphQL查询优化

授权引擎使用 ACL(访问控制列表)验证节点和字段权限,并根据权限优化 GraphQL 查询。此外,N+1 解析器通过合并查询来提高性能。这种方法解决了 N+1 问题。

Figure 1



角色

  • GraphQL 查询:客户端向 GraphQL 服务器发送的请求,以获取特定数据。
  • GraphQL 引擎:指允许您执行 GraphQL 查询的服务。
  • 授权引擎:使用 ACL 验证节点和字段的权限,并根据字段权限优化 GraphQL 查询。
  • N+1 解析器:减少与多个数据库查询相关的开销和延迟,提高性能和效率。

Figure 2

Figure 3

增强访问控制

现有实现

假设一个应用有产品、供应商和地址。访问供应商和地址数据需要用户认证,这可以在解析器中轻松处理。

然而,供应商数据仅限于管理员用户,某些供应商字段仅对特定角色可访问。另一方面,产品是公开的,可以使用产品所有者角色查看。运行提到的查询(图3)将返回产品数据以及关联的供应商和地址数据,从而导致安全问题。

增强实现

根据用户权限验证查询的节点和字段,并生成优化的GraphQL查询。

Figure 3.1 (Flow Diagram)

 

Figure 4

图4是一个示例,展示了如何在Node.js中实现自定义身份验证的GraphQL API。在这段代码中,角色从授权标头中提取,然后与查询一起使用来验证授权。

Figure 5

在这个例子中,我们使用会话或请求中用户的角色和权限来控制对GraphQL模式中特定查询和变更的访问。我们已经在GraphQL模式中为所有用户定义了角色和权限规则。

该方法递归地检查所有节点和字段的角色和权限。如果一个节点或字段没有权限,则根据配置执行以下操作之一:

  • 移除节点或字段。
  • 返回带有错误消息的字段或节点。
  • 抛出异常。

一旦GraphQL查询根据模式得到验证,该方法将返回优化的GraphQL查询。

使用N+1增强ORM查询优化

现有实现

这是一个影响查询性能的技术问题。它可能会发生在使用对象关系映射(ORM)框架访问数据库的应用程序中。通常出现在应用程序需要从数据库加载一组相关实体的情况下。

假设有2个产品;它需要执行1次查询来检索产品,并执行2次额外的查询来分别获取每个产品的供应商。

一个查询检索产品列表,另一个查询为每个产品获取供应商。供应商查询次数等于产品数量。

Figure 6

Figure 7

增强实现

一旦请求到达N+1解析器,N+1解析器会优化查询以最小化数据库请求次数,通过将其减少到一个用于主要数据的查询和一个用于相关数据的附加查询,从而有效地缓解N+1问题。

  1. 主数据查询:检索应用程序所需的主要数据集的单个查询。
  2. 相关数据查询:获取任何必要的相关数据以完成数据集的附加查询。

Figure 8

Figure 9: Total No. of Queries are 2 (1 for Product, 1 for Vendor)

Figure 10

完成所有查询解析器后,服务器以JSON格式将优化后的数据返回给客户端。

结论

我们已经概述了实施精细授权机制以及增强安全措施对于保护 GraphQL API 至关重要。这包括节点级和字段级安全性。

正如本文所述,当未经优化的查询导致 GraphQL 中数据库调用过多时,就会出现 N+1 问题。我们提供了一种解决方案来克服 N+1 问题。它降低了数据库服务器资源的使用,从而节约成本并提高可伸缩性。此外,通过提升查询性能,可以减少查询响应时间,进而改善用户体验。

Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries