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