将node.js服务器的javascript处理转移到客户端

Moving node.js server javascript processing to the client

本文关键字:处理 转移 客户端 javascript node js 服务器      更新时间:2023-09-26

我想就将传统上在服务器上完成的处理转移到node.js web应用程序中由客户端处理的实际含义发表一些意见。

示例案例研究:用户上传一个CSV文件,其中包含他们多年的银行对账单条目。我们想解析文件,对每个条目进行分类,并计算每个类别的累积值,这样我们就可以将新分类的报表存储在数据库中,并向用户显示支出分析。

条目按描述中的匹配字符串进行分类。有许多类别和许多条目,处理需要相当长的时间。

在我们的node.js服务器中,我们可以在等待网络响应等的同时愉快地释放事件循环,但如果有任何数据处理或类似的处理,服务器将被阻止响应请求,这似乎是不可避免的。

传统上,CSV文件将被传递到服务器,服务器将进行处理,保存在数据库中,并发回处理的输出。

在我们的单线程node.js服务器中,这种处理由浏览器处理,并显示输出并发送到服务器进行存储,这似乎是有道理的。当然,客户端必须等待,但它们的处理不会阻止服务器响应其他客户端的请求。

我很想看看是否有人有使用这种模型构建应用程序的经验。

所以,问题是…如果可能的话,让浏览器而不是服务器来处理任何会阻止事件循环的处理,是否存在任何问题?这是node.js应用程序开发的一种好的/明智的/可行的方法吗?

我不认为信任客户端处理的数据是个好主意。

相反,您应该考虑创建一个单独的进程侦听的工作队列,将CPU密集型任务与处理HTTP请求的node.js进程分开。


我建议的数据流是:

  1. HTTP上传请求
  2. 应用程序服务器(将原始文件保存到工作进程可以访问的位置)
  3. 通知"csv"工作队列
  4. 工作进程上载了csv文件

尽管完全可能,但简单地将处理转移到客户端机器并不能解决基本问题。

现在,客户端的事件循环被阻止,从而阻止用户与浏览器进行交互。浏览器往往会检测到这个问题,并完全停止执行页面的脚本。这是你的用户肯定会讨厌的。

既没有办法委派也没有办法分担工作量。使用第二个进程(例如第二个节点实例)在服务器端进行数字运算还有一个额外的好处,那就是允许操作系统使用第二CPU内核。理想情况下,只要服务器中有CPU核心,就可以运行尽可能多的Node实例,并在它们之间平衡工作负载。看看二极管模块,了解如何在节点中实现多进程通信。