微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于大型请求,可以在 Express 服务器上替代 GraphQL 长轮询吗?

如何解决对于大型请求,可以在 Express 服务器上替代 GraphQL 长轮询吗?

目标

我需要在我的 React Web 应用程序前端显示一个大数据表。

我的后端是一个带有 GraphQL 层和一些“普通”端点的 Express 服务器。

我的服务器从各种来源获取数据,包括一个外部 API,这是我当前任务的数据源。

我的服务器有一个我可以自由使用的数据库。我无法从前端直接访问外部 API。

数据全部来自我提到的外部API。实际上,它来自对具有许多不同 ID 的同一端点的多个类似调用。这些单独的调用中的每一个都需要一段时间才能返回,但不会冒超时的风险。

当前解决方

我的简单实现:我执行了一个 GraphQL 查询,其中解析器并行执行对外部服务的所有 API 调用。它使用 Promise.all() 等待它们全部完成。然后它返回一个包含我需要的所有数据到我的服务器的大数组。然后我的服务器将该数据返回给我。

当前解决方案的问题

不幸的是,这有时会使我的前端挂起太久并且超时(需要超过 2 分钟)。

建议的解决方

有没有比在 GraphQL 中手动实现长轮询更好的方法? 这是我目前解决方案的主要计划:

  • 前端向我的服务器发送请求
  • 服务器返回 200 并开始访问外部 API,并在数据库中设置一个标志
  • 服务器将每个 API 调用的结果在完成时存储在数据库
  • 与此同时,前端会显示一个加载屏幕,并不断对像 MyBigTableData 这样的实体进行相同的 GraphQL 查询,它会告诉我有多少外部 API 调用返回
  • 当它们都返回后,下次我请求 MyBigTableData 时,服务器会发回所有数据。

问题

对于我必须做的这个大请求,有没有更好的替代 GraphQL 在 Express 服务器上的长轮询?

我想到的另一种方法是不使用 GraphQL,而是使用标准的 HTTP 端点,但我不确定这真的有多大区别。

我还看到 HTTP/2 具有可能相关的多路复用。我的服务器目前运行 HTTP/1.1,升级对我来说是未知的。

我看到 here Keep-Alive 听起来可能是相关的,但在 Safari 中无法使用,这很糟糕,因为我的许多用户使用 Safari 访问前端。

由于技术限制,我无法使用 WebSocket。我也不想在我的客户端上设置一个荒谬的超时时间(我不确定是否可能)

解决方法

我发现 GraphQL 在 https://www.apollographql.com/docs/react/data/queries/#polling 中内置了轮询

最后,我实际上做了一个 REST 轮询系统,其中服务器发送一个“预期完成时间”,以便可以动态调整轮询频率。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。