GraphQL有什么缺点吗?[关闭]


Answers:


95

缺点:

  • 需要学习如何设置GraphQL。生态系统仍在迅速发展,因此您必须跟上。
  • 您需要从客户端发送查询,您可以只发送字符串,但是如果您想要更舒适和缓存,可以使用客户端库-> 客户端中的其他代码
  • 您需要预先定义架构=> 获得结果之前的额外工作
  • 您需要在服务器上有一个graphql端点=> 您尚不知道的新库
  • Graphql查询比直接转到REST端点要更多字节
  • 服务器需要做更多处理以解析查询并验证参数

但是,这些远远不止这些:

  • GraphQL 不难学习
  • 额外的代码只有几个KB
  • 通过定义模式,您将避免在修正错误和进行繁琐的升级之后进行更多工作
  • 有很多人切换到GraphQL,因此开发了一个丰富的生态系统,并提供了出色的工具
  • 在生产中使用持久查询时(仅用ID和参数替换GraphQL查询),实际上发送的字节数比REST
  • 传入查询的额外处理可以忽略不计
  • 提供API与后端干净分离,可以在后端改进上更快地迭代

1
“在获得结果之前,您需要预先定义架构=>额外的工作”我不知道如果没有GraphQL,这是没有必要的吗?当然,不需要使用某些语言的某些框架,但是例如对于Java API,您仍然必须在模型中描述“模式”。
AntoineB '16

3
@AntoineB您是正确的,但是在NodeJS中,您可以轻松创建REST API,而无需考虑整体架构;只是退货。
w00t

1
@ w00t,一旦您需要使用REST的一些参数,就将诉诸于解析URL,以检查参数的类型是否正确,如果不是,则抛出400。如果只有某些事情可以避免必须在每个路由处理程序中手动执行此操作:D
Capaj,

随着春天引导你可以拉一些文物graphql-spring-boot-startergraphql-java-tools上手。在.graphqls资源中创建架构并创建Resolver类,您就完成了。要启动并运行一个有效的测试示例,大约需要10分钟。
Babyburger

1
我不同意所有缺点,实际上它可以节省您很多时间查看此帖子xalitech.com/graphql-how-to-convince-your-boss
Shafqat Ali

58

对于考虑使用GraphQL的任何人,我已经发现了一些重要的问题,到目前为止,要点是:

不定深度查询:GraphQL无法按不定深度查询,因此,如果您有一棵树并想返回一个不知道深度的分支,则必须进行一些分页。

特定的响应结构:在GraphQL中,响应与查询的形状匹配,因此,如果您需要以非常特定的结构进行响应,则必须添加一个转换层以重新调整响应的形状。

网络级缓存:由于GraphQL通常用于HTTP(单个端点中的POST)上,因此网络级缓存变得很困难。解决此问题的一种方法是使用持久查询。

处理文件上传:GraphQL规范中没有关于文件上传的内容,并且变体不接受参数中的文件。为了解决这个问题,您可以使用其他类型的API(例如REST)上传文件,并将上传文件的URL传递给GraphQL突变,或者将文件注入执行上下文中,以便将文件包含在resolver函数中。

不可预测的执行:GraphQL的本质是您可以查询组合所需的任何字段,但是这种灵活性并非免费的。最好了解一些问题,例如性能和N + 1查询。

超级简单的API:如果您拥有公开一个非常简单的API的服务,则GraphQL只会增加额外的复杂性,因此简单的REST API可能会更好。


2
对于不确定的深度,我求助于JsonType响应。它不是强类型的,因此您需要检查输入,但是它非常方便。
w00t

3
REST始终存在N + 1个查询问题。唯一的区别是,按设计,REST不允许后端甚至尝试解决问题。相反,它将问题推向了前端。
Capaj

39

我在graphQL上看到的最大问题是,如果您正在使用关系数据库,那就是joins

  1. 您可以允许/禁止一些字段的事实使联接变得很简单(不简单)。这导致额外的查询。

  2. 同样,graphql中的嵌套查询会导致循环查询,并且可能使服务器崩溃。必须格外小心。

  3. 限制呼叫速率变得很困难,因为现在用户可以在一个呼叫中触发多个查询。

提示:在使用javascript / node的情况下,使用facebook的dataloader减少查询数量


1.所选字段与联接操作有何关系?2.如果您使用数据加载器,则不会。3.您可以解析并分配cost给请求。如果使用预定义查询(客户端仅发送ID),这也不是问题。
zoran404

1
同意2。由于3的额外工作,更重要的是ppl需要注意。
aWebDeveloper

2.这不再是正确的,因为您可以使用许多工具来保护服务器。例如,链接:howtographql.com/advanced/4-security超时,复杂性和深度限制。因此,就像您将说的一样,如果您不使用速率限制器,您的REST将可用于DDoS。事情变了
Yevhenii Herasymchuk '18

更新的第2点
aWebDeveloper

13

每年它都在变得越来越好,就目前而言,GraphQL 社区正在增长,因此,针对许多问题的解决方案更多了,这些问题在以前的其他答案中都得到了强调。但是要承认将所有资源投入GraphQL仍然使公司陷入困境,我想列出一些问题和解决方案,然后是未解决的问题和解决方案。

  • 网络级别的缓存 -正如Bruno所说的,这是持久查询,您当然可以在客户端缓存,没有人阻止您在数据库级别甚至Redis上使用缓存。但是当然,因为GraphQL只有一个端点,并且每个查询都不同-与使用REST相比,执行这种类型的缓存要复杂得多。
  • GraphQL中的嵌套查询会导致循环查询,并且可能导致服务器崩溃 -各种各样的解决方案不再是问题。其中一些列在这里
  • 处理文件上传 -我们已经很多解决方案,

但是还有更多情况可以算作不利条件:

  • 样板过多(对于我来说,例如,用于创建新查询,您需要定义架构,解析器和解析器内部,以明确说明GraphQL如何解析内部的数据和字段,在客户端上创建与以下字段完全相关的查询该数据)
  • 错误处理 -我需要说的是,它与与REST的比较关系更大。阿波罗在这里是可能的,但与此同时,它比REST更复杂
  • 身份验证和授权 -但正如我所说的社区与出色的速度增加,有已经 对夫妇 解决方案,为实现这一目标。

综上所述,GraphQL只是实现特定目标的工具,并确保它不是所有问题的灵丹妙药,当然也不是REST的替代品。


3

拥有一个端点并公开所有数据确实很棒。我发现GraphQL需要考虑以下几点:

  1. 文件下载/上传的实现比较棘手(对于大文件,转换为字符串可能不是最佳选择)
  2. 前端和后端都有很多样板代码和架构代码。
  3. 遵循并支持GraphQL规范中提供的分页。
  4. 允许自定义顺序和字段排序的优先逻辑。例如,如果我们获取用户数据以及相关的组和角色。用户可以根据用户名,组名或角色名对数据进行多种排序。
  5. 身份验证和授权将取决于后端框架。
  6. 确保为每个graphql命令触发单个查询的后端优化和数据库支持可能会很棘手。

此外,在实施后应该考虑专业人士:

  1. 非常灵活,可以支持新项目并更新现有行为。
  2. 实施后即可使用参数和自定义顺序轻松添加条件

  3. 使用大量自定义过滤器,并摆脱所有需要创建的操作,例如,用户可以将id,name等作为参数并执行过滤。另外,过滤器也可以应用于用户中的组。

  4. 通过创建包含所有GraphQL查询和变异的文件,可以轻松测试API。
  5. 一旦理解了该概念,变异就很容易实现。
  6. 提取多个深度数据的强大方法。
  7. Voyager和GraphiQL UI或Playground的支持使其易于查看和使用。
  8. 使用有效的描述方法定义架构时,文档易于编写。

3

我认为目前graphql必须是后端架构的一部分,对于文件上传,您仍然会点击常规api

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.