在 Express 服务器上为大型请求替代 GraphQL 长轮询?
Alternative to GraphQL long polling on an Express server for a large request?
Objective
我需要在我的 React 网络应用程序前端显示大量 table 数据。
我的后端是一个带有 GraphQL 层和一些“正常”端点的 Express 服务器。
我的服务器从各种来源获取数据,包括外部 API,它是我当前任务的数据源。
我的服务器有一个我可以自由使用的数据库。我无法从前端直接访问外部 API。
数据全部来自我提到的外部API。事实上,它来自对具有许多不同 ID 的同一端点的多个类似调用。这些单独的调用中的每一个都需要一段时间才能 return 但不会冒超时的风险。
当前解决方案
我的天真实现:我执行一个 GraphQL 查询,其中解析器并行执行对外部服务的所有 API 调用。它使用 Promise.all()
等待它们全部完成。然后它 return 是一个大数组,其中包含我的服务器所需的所有数据。然后我的服务器 return 将数据发送给我。
当前解决方案存在问题
不幸的是,这有时会使我的前端挂起太久而超时(超过 2 分钟)。
建议的解决方案
有没有比在 GraphQL 中手动实现长轮询更好的方法?
这是我目前主要的解决方案:
- 前端向我的服务器发送请求
- 服务器 returns 一个 200 并开始访问外部 API,并在数据库中设置一个标志
- 服务器在完成时将每个 API 调用的结果存储在数据库中
- 与此同时,前端显示一个加载屏幕并不断对
MyBigTableData
等实体进行相同的 GraphQL 查询,这将告诉我有多少外部 API 调用具有 return埃德
- 当他们全部 returned 时,下次我请求
MyBigTableData
时,服务器将发回所有数据。
问题
对于我必须做的这个大请求,是否有比 Express 服务器上的 GraphQL 长轮询更好的替代方案?
想到的一个替代方案是不使用 GraphQL,而是使用标准的 HTTP 端点,但我不确定这是否真的有很大的不同。
我还看到 HTTP/2 具有可能相关的多路复用。我的服务器当前运行 HTTP/1.1,升级对我来说是个未知数。
我看到 here Keep-Alive,这听起来可能是相关的,但在 Safari 中无法使用,这很糟糕,因为我的许多用户使用 Safari 访问前端。
由于技术限制,我无法使用 WebSockets。我也不想在我的客户端上设置一个长得可笑的超时时间(我不确定这是否可能)
我发现 GraphQL 内置了轮询 https://www.apollographql.com/docs/react/data/queries/#polling
最后,我实际上做了一个 REST 轮询系统,服务器发送一个“预期完成时间”,这样轮询频率就可以动态调整。
Objective
我需要在我的 React 网络应用程序前端显示大量 table 数据。
我的后端是一个带有 GraphQL 层和一些“正常”端点的 Express 服务器。
我的服务器从各种来源获取数据,包括外部 API,它是我当前任务的数据源。
我的服务器有一个我可以自由使用的数据库。我无法从前端直接访问外部 API。
数据全部来自我提到的外部API。事实上,它来自对具有许多不同 ID 的同一端点的多个类似调用。这些单独的调用中的每一个都需要一段时间才能 return 但不会冒超时的风险。
当前解决方案
我的天真实现:我执行一个 GraphQL 查询,其中解析器并行执行对外部服务的所有 API 调用。它使用 Promise.all()
等待它们全部完成。然后它 return 是一个大数组,其中包含我的服务器所需的所有数据。然后我的服务器 return 将数据发送给我。
当前解决方案存在问题
不幸的是,这有时会使我的前端挂起太久而超时(超过 2 分钟)。
建议的解决方案
有没有比在 GraphQL 中手动实现长轮询更好的方法? 这是我目前主要的解决方案:
- 前端向我的服务器发送请求
- 服务器 returns 一个 200 并开始访问外部 API,并在数据库中设置一个标志
- 服务器在完成时将每个 API 调用的结果存储在数据库中
- 与此同时,前端显示一个加载屏幕并不断对
MyBigTableData
等实体进行相同的 GraphQL 查询,这将告诉我有多少外部 API 调用具有 return埃德 - 当他们全部 returned 时,下次我请求
MyBigTableData
时,服务器将发回所有数据。
问题
对于我必须做的这个大请求,是否有比 Express 服务器上的 GraphQL 长轮询更好的替代方案?
想到的一个替代方案是不使用 GraphQL,而是使用标准的 HTTP 端点,但我不确定这是否真的有很大的不同。
我还看到 HTTP/2 具有可能相关的多路复用。我的服务器当前运行 HTTP/1.1,升级对我来说是个未知数。
我看到 here Keep-Alive,这听起来可能是相关的,但在 Safari 中无法使用,这很糟糕,因为我的许多用户使用 Safari 访问前端。
由于技术限制,我无法使用 WebSockets。我也不想在我的客户端上设置一个长得可笑的超时时间(我不确定这是否可能)
我发现 GraphQL 内置了轮询 https://www.apollographql.com/docs/react/data/queries/#polling
最后,我实际上做了一个 REST 轮询系统,服务器发送一个“预期完成时间”,这样轮询频率就可以动态调整。