【问题标题】:Handle long-running request from Swift Client in Node.js在 Node.js 中处理来自 Swift 客户端的长时间运行的请求
【发布时间】:2021-12-28 11:09:15
【问题描述】:

所以我目前正在使用 socket.io 作为加载屏幕,但它无法正常工作,所以我将尝试不同的解决方案。我需要发生以下事情:用户打开我的应用程序——这会触发服务器端的一个功能(CPU 密集型抓取功能大约需要 8 秒)。功能完成后,我需要通知客户端功能已完成并且客户端获取结果(获取此结果后,应用加载屏幕关闭,用户进入应用)。

我目前的实现是使用 socket.io 排放并通过后台线程上的 Redis 队列处理抓取功能。

是否有不同的方法来执行此操作,而不是使用套接字连接并从客户端 -> 服务器发送发射,反之亦然?

我认为我不能只处理经典的 GET 请求,因为在等待响应的同时让长时间运行(8 秒)的请求打开这么长时间不是不好的做法吗?另外,我查看了服务器发送的事件,但我不确定在这种情况下能否使用它。

非常感谢任何见解!

【问题讨论】:

  • FWIW,socket.io 的工作原理是“让长时间运行的请求保持打开状态”。当您的客户端应用程序与 socket.io 连接时,它使用普通的 HTTPS 连接,然后“升级”到 websocket 连接并保持打开状态。所以,如果 socket.io 适合你,那很好。
  • @O.Jones 是的,这就是问题所在...socket.io 以传输关闭和传输错误问题的形式给我带来了不小的痛苦,所以我宁愿只使用不同的实现,如果可能。
  • 您问题上的标签令人困惑。 redisswift 与这个问题有什么关系?我猜你是从你的 nodejs 服务器应用程序中进行的。你用什么图书馆?请edit您的问题或提出其他问题。
  • 我使用 SerpAPI 进行抓取,我还使用了一些地理编码 API 函数调用。 Redis 目前在 Node.js 后端用于对抓取请求进行排队,而 Swift 是在前端(客户端)使用的。

标签: javascript node.js swift redis long-running-processes


【解决方案1】:

对于来自“健康”服务器的响应,8 秒比正常时间长,但应该没问题。我只是使用来自移动客户端的 GET,并编写它以在等待时不阻塞 UI。

编写您的 UI,以便通知用户它正在等待响应,甚至可能让用户了解响应可能需要多长时间。

【讨论】:

  • 有什么更好的方法吗?另外,我不应该将抓取过程卸载到工作线程以获得更好的长期可扩展性吗?
  • 您是在询问服务器进程的设置吗?我是一名 iOS 工程师,正在解决问题的移动端。我没有资格回答你关于 Node.js 实现的问题。
  • 哦,好吧,所以从 iOS 方面来说,如果我只是做一个经典的 HTTP GET 请求,然后在 URLSession.shared.dataTask() 的回调中,我使用 DispatchQueue 中的服务器响应,那是非阻塞的,对吗?
  • 大部分正确。网络事务始终是异步且非阻塞的。默认情况下,委托方法/闭包在后台队列中调用,因此您可以在不阻塞主线程的情况下进行耗时的工作。因此,您不必做任何特别的事情来避免在处理响应时阻塞主线程。 (无需创建 DispatchQueue)
【解决方案2】:

注意几点。

  1. nodejs 通常可以做很多并发的网络爬取:大部分网络爬取经过的时间都花在等待被爬取的服务器响应上。 nodejs 是异步的。所以工作线程可能没有多大帮助。它们肯定会使您的服务器应用程序更加复杂。 clustering 你的 nodejs 应用程序可能是一个很好的选择。
  2. 除了损害用户体验之外,编写服务器以延迟对 GET 请求的响应几秒钟没有任何害处。如果您的用户在这几秒钟内有一些合理的东西可以查看,那么您可能会侥幸逃脱。
  3. 如果您的用户在该停顿期间正在查看网页,您可以使用页面中的 Javascript 代码中的 xhrfetch 检索该数据,同时使用微调器或一些类似的用户界面工具来娱乐他们。

【讨论】:

  • 好的,所以我将做一些测试,就像将其编写为 GET 请求一样,我将研究是否可能使用集群。用户只是在请求发生时查看加载屏幕。
  • 另外,我的抓取函数是一个有很多等待的异步函数,因为我需要代码以特定顺序执行,因为某些 API 调用依赖于之前的调用。这是否意味着它会阻塞?
  • async / await 对nodejs异步操作绝对友好。当您进行 CPU 密集型计算时,而不是当 nodejs 正在等待某些网络请求的完成时,会出现令人讨厌的阻塞。唯一阻止您同时运行多个 API 查找的是您的 API 订阅计划的并发限制。 (SerpAPI 上的开发计划每小时 1000 个请求,)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2012-08-20
  • 2017-07-10
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多