每个用户结构的 NodeJS 轮询最佳实践
NodeJS Polling per User Structure best practice
我的项目是一个全栈应用程序,其中 Web 客户端订阅了一个未准备好的对象。当订阅被触发时,后端将 运行 一个观察循环到那个未准备好的对象,直到它准备好。当发生这种情况时,它会通过 socketIO 向前端发送一条消息(欢迎提出建议,我不太确定这是否是最好的方法)。我的问题是如何构建观察循环。
我的前端基本上订阅了后端,并获得 return 200,如果订阅正确,将连接到每个 Websocket (socketIO) 的服务器,或者如果发生错误,则返回错误 4XX 代码错误的。在后端,当用户订阅时,它应该为该用户启动一个“线程”(我知道 Nodejs 不支持线程,它只是为了心理图像)每 10 次从 api 轮询一次信息大约几秒钟。
我这样做,因为我轮询的 API 不支持 WebHooks,所以我需要观察 API 响应,直到它处于我想要的状态(这部分我已经清除了)。
我想问的是,是否存在真正用于此类任务的第三方库?我应该使用工作线程还是由 类 抽象的简单 setTimeouts?响应将通过 SocketIO 发送,那部分我也已经开始工作了,这只是我正在使用的方法我不太确定如何构建。
我也愿意使用另一种合适的编程语言来简化此案例的解决。我不着急。
轮询网络请求(听起来像这样)是非阻塞和异步的,所以它不会真正占用你的 nodejs CPU 除非你正在做一些重量级的计算结果。
因此,单个 nodejs 线程可以在不添加 WorkerThreads 或集群的情况下发出大量网络请求(用于轮询和通过 socket.io 连接发送数据)。这是nodejs非常非常擅长的事情。
我不知道有任何专门用于此的第三方库,因为无论如何您都必须自定义代码来查看网络请求的结果,这就是大部分编码。列出了一些用于从列出的 nodejs 向其他服务器发出 http 请求的库 here. My favorite in that list is got(),但您可以查看选择并决定您喜欢什么。
至于发出重复请求,我可能只会使用重复 setTimeout()
调用或 setInterval()
调用。
您没有说明是否必须为订阅某项内容的每个客户端发出单独的请求,或者您是否可以以某种方式组合观看同一资源的所有客户端,以便您对所有客户端使用相同的轮询间隔.如果能做到后者,那肯定效率更高
如果在扩展时 运行 遇到扩展问题,那么您可以将轮询代码移动到一个或多个子进程或 WorkerThreads,然后在您需要时通过消息传递回主线程找到一个需要发送给客户端的新状态。但是,我预计在达到更大的规模之前,您不需要编写额外的步骤。与大多数扩展性事物一样,您需要编写更基本的选项(它本身应该可以很好地扩展),然后进行测量和基准测试,查看瓶颈在哪里,并根据数据而不是猜测修改架构。很多时候,架构的过度设计和实施是基于人们认为瓶颈可能在哪里,而不是它们实际出现的地方。这不仅会使开发花费更长的时间,最终实现比所需的更复杂的实现,而且还可能将开发定位在问题的错误部分。配置、测量,然后决定。
我的项目是一个全栈应用程序,其中 Web 客户端订阅了一个未准备好的对象。当订阅被触发时,后端将 运行 一个观察循环到那个未准备好的对象,直到它准备好。当发生这种情况时,它会通过 socketIO 向前端发送一条消息(欢迎提出建议,我不太确定这是否是最好的方法)。我的问题是如何构建观察循环。
我的前端基本上订阅了后端,并获得 return 200,如果订阅正确,将连接到每个 Websocket (socketIO) 的服务器,或者如果发生错误,则返回错误 4XX 代码错误的。在后端,当用户订阅时,它应该为该用户启动一个“线程”(我知道 Nodejs 不支持线程,它只是为了心理图像)每 10 次从 api 轮询一次信息大约几秒钟。
我这样做,因为我轮询的 API 不支持 WebHooks,所以我需要观察 API 响应,直到它处于我想要的状态(这部分我已经清除了)。
我想问的是,是否存在真正用于此类任务的第三方库?我应该使用工作线程还是由 类 抽象的简单 setTimeouts?响应将通过 SocketIO 发送,那部分我也已经开始工作了,这只是我正在使用的方法我不太确定如何构建。
我也愿意使用另一种合适的编程语言来简化此案例的解决。我不着急。
轮询网络请求(听起来像这样)是非阻塞和异步的,所以它不会真正占用你的 nodejs CPU 除非你正在做一些重量级的计算结果。
因此,单个 nodejs 线程可以在不添加 WorkerThreads 或集群的情况下发出大量网络请求(用于轮询和通过 socket.io 连接发送数据)。这是nodejs非常非常擅长的事情。
我不知道有任何专门用于此的第三方库,因为无论如何您都必须自定义代码来查看网络请求的结果,这就是大部分编码。列出了一些用于从列出的 nodejs 向其他服务器发出 http 请求的库 here. My favorite in that list is got(),但您可以查看选择并决定您喜欢什么。
至于发出重复请求,我可能只会使用重复 setTimeout()
调用或 setInterval()
调用。
您没有说明是否必须为订阅某项内容的每个客户端发出单独的请求,或者您是否可以以某种方式组合观看同一资源的所有客户端,以便您对所有客户端使用相同的轮询间隔.如果能做到后者,那肯定效率更高
如果在扩展时 运行 遇到扩展问题,那么您可以将轮询代码移动到一个或多个子进程或 WorkerThreads,然后在您需要时通过消息传递回主线程找到一个需要发送给客户端的新状态。但是,我预计在达到更大的规模之前,您不需要编写额外的步骤。与大多数扩展性事物一样,您需要编写更基本的选项(它本身应该可以很好地扩展),然后进行测量和基准测试,查看瓶颈在哪里,并根据数据而不是猜测修改架构。很多时候,架构的过度设计和实施是基于人们认为瓶颈可能在哪里,而不是它们实际出现的地方。这不仅会使开发花费更长的时间,最终实现比所需的更复杂的实现,而且还可能将开发定位在问题的错误部分。配置、测量,然后决定。