延迟查询和缓存 —— 解决 GraphQL 在大型应用程序中的性能问题

阅读时长 5 分钟读完

GraphQL 作为一种强大的查询语言,大力推崇数据的精确性和灵活性,但在大规模应用程序中,它常常会带来性能问题。经常查询庞大的数据集,或者查询网络延迟长的数据源,都可能迅速增加查询时间。

解决这些问题的一个有用的方法是使用延迟查询和缓存。这两种技术通常组合在一起使用,可以显著降低 GraphQL 请求的响应时间。

延迟查询

延迟查询是一种延迟加载数据的技术。它利用了 GraphQL 查询和类型的可选性和灵活性,使得只有在需要时才返回数据。

这种方法的实现方式是将查询的字段标记为“延迟”,在需要时才从数据库或其他数据源中检索数据。

通过 DataLoader 进行延迟查询

DataLoader 是一种用于在 GraphQL 应用程序中进行批处理和缓存的 JavaScript 库。它的工作方式是:当 DataLoader 被调用时,它会等待一段时间以允许其他调用相同的 DataLoader 方法。这个等待期可以让 DataLoader 使用单个查询来检索多个数据点。这样可以减少轮询数据源的次数,提高响应时间。

下面是使用 DataLoader 实现延迟加载数据的示例代码:

-- -------------------- ---- -------
----- ---------- - ----------------------
----- - ------------------- ------------------- - - -------------------

----- ------------ - --- ---------------- ----------- -- -
  ----- ------- - ----- -------------------------------
  ------ -------------------- -- -------------
---

----- --------- - -
  ------ -
    ---------------- ----- -------- - -------- -- -- -
      ----- ----- - ----- -----------------------------
      ------ ---------------- -- --
        --------
        ----------- -- -- ---------------------------------
      ----
    --
  --
--

在这个代码中,我们定义了一个 DataLoader 对象,并用它来获取给定 ID 的作者的名称。我们把 DataLoader 对象存储在 resolvers 中并将它与 Graphql 的查询函数连接起来。我们还向 booksByAuthorId 对象添加了一个字段,该字段异步从 authorLoader 中检索作者姓名。这些查询会在需要时对 authorLoader 进行调用。

缓存

缓存是另一种在大规模 GraphQL 应用程序中提高性能的技术。它的方法是将所有GraphQL查询的结果缓存到内存中,以便将来可以立即返回它们,而不必重新查询底层数据源。

对于 GraphQL 应用程序,使用下面的步骤可以很容易地实现缓存:

  1. 了解查询的唯一标识符。
  2. 缓存查询结果。
  3. 检查是否存在缓存的查询结果。
  4. 如果存在,立即返回缓存的结果。
  5. 如果不存在,则在执行完查询后将其结果缓存,并返回结果。

使用 Redis 实现 GraphQL 缓存

Redis 是一种高性能内存数据存储器,常用于缓存web应用程序中需要访问的数据。通过将 GraphQL 查询结果存储在 Redis 缓存中,我们可以将Redux的性能提高10倍以上。

以下是示例代码,演示了如何使用 Redis 设置缓存:

-- -------------------- ---- -------
----- - --------- - - ----------------
----- ----- - -----------------

----- ---------- - -----
----- ------ - -------------------- ----- ------------ ----- ---------- ---
----- ------------- - -----------------------------------
----- ------------- - -----------------------------------

----- ----- - ----- ----- ----- ------ -- -
  ----- ------ - ----- -------------------
  -- -------- -
    ------ -------------------
  -

  ----- ------ - ----- --------
  ----- ------------------ ----- ------------------------
  ------ -------
--

----- --------- - -
  ------ -
    ----------- ----- -------- - -------- -- -- -
      ----- --- - ---------------------
      ----- ------ - ----- ---------- ----- ----- -- -- -
        ----- ------ - ----- ------------------------
        ------ -------
      ---
      ------ -------
    --
  --
--

在这个代码中,我们定义了一个作为Redis cache的cache函数。他接受一个键,一个缓存时间(以秒为单位)和一个回调函数,该回调函数执行GraphQL查询。

cache函数首先检查它是否已经缓存了一个具有相同的key,如果找到了一个缓存的查询结果,将立即返回它。否则,他会使用回调函数进行GraphQL查询,然后将结果存储到Redis数据库中。

在这个例子中,我们将作者的ID作为缓存的键。当GraphQL API的authorById查询字段使用时,作者的ID会变为Redis缓存中的键并在缓存中查找。如果找到了缓存,GraphQL将立即返回作者数据。

结论

延迟查询和缓存都是提高GraphQL性能的强大工具。虽然它们可以单独使用,但它们通常结合在一起使用以实现最大的性能优势。

了解如何利用这些技术将有助于你构建快速,高效的GraphQL API,从而使你的应用程序更快,更可靠并更具可扩展性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672efa9eeedcc8a97c8bc372

纠错
反馈