什么是过度获取或不足获取?

What is Over-Fetching or Under-fetching?

我有时会玩 graphQL。在 graphQL 之前,我们通常使用 REST API。许多开发人员表示,graphQL 修复了 REST 的一些问题。 (例如,过度获取和获取不足)。我对这个术语感到困惑。

有人可以解释一下在这种情况下什么是过度提取和不足提取吗?

谢谢,

过度获取是指获取了太多数据,这意味着响应中有您不使用的数据。

提取不足是指调用端点时没有足够的数据,迫使您调用第二个端点。

在这两种情况下,它们都是性能问题:您要么使用了比理想情况更多的带宽,要么发出了比理想情况更多的 HTTP 请求。

在一个完美的世界里,这些问题永远不会出现;您将拥有完全正确的端点来为您的产品提供完全正确的数据。

当您扩展和迭代产品时,经常会出现这些问题。 您在页面上使用的数据经常发生变化,并且为每个组件维护一个具有完全正确数据的单独端点的成本变得过高。

因此,您最终会在没有太多端点和让端点最适合每个组件的需求之间做出折衷。这将导致在某些情况下过度获取(端点将提供比某个特定组件所需的数据更多的数据),并在其他一些情况下导致获取不足(您将需要调用第二个端点)。


GraphQL 修复了这个问题,因为它允许您从服务器请求您想要的数据。您指定所需的内容,一次访问服务器即可获取此数据,并且仅此数据。

Over-fetching 和 under-fetching 在像 Ruby 这样的动态语言中,过度获取和获取不足是两个常见的陷阱。

Over-fetching Over-fetching 在片段中声明了附加字段但实际上并未在模板中使用时发生。当修改模板代码以删除某个字段的使用时,可能会发生这种情况。

如果片段没有随着这个改变而更新,当我们不再需要它时,属性 仍然会被获取。一个简单的标题字段在实践中可能没什么大不了的,但这个 属性 可能是一个更昂贵的嵌套数据树。

Under-fetching Under-fetching 当字段未在片段中声明但在模板中使用时发生。此缺失数据可能会以 NoFieldError 或 nil 值的形式出现。

更糟糕的是,当模板未声明数据依赖性但看起来正常工作时,可能存在潜在的 under-fetch 错误,因为它的调用者恰好在上游获取了正确的数据。但是当从不同的路径渲染同一个模板时,它会在丢失数据时出错。

Over fetching 意味着您正在获取此时无用的无关变量。 Under fetching 表示此时您正在获取较少的变量