如何解决对于大型请求,可以在 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 举报,一经查实,本站将立刻删除。