2012-02-04 175 views
1

我想就移动处理的实际影响提出一些意见,这些处理传统上将在服务器上完成,而不是由客户端在node.js Web应用程序中处理。将node.js服务器javascript处理移动到客户端

案例研究案例: 用户上传一份包含多年银行对帐单条目的CSV文件。我们希望解析文件,对每个条目进行分类并计算每个类别的累计值,以便我们可以将新分类的语句存储在数据库中,并向用户显示支出分析。

条目按照说明中的匹配字符串进行分类。有许多类别和许多条目,并且需要相当长的时间来处理。

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

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

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

我很想看看有没有人有过使用此模型构建应用程序的经验。

所以,问题是..是否有任何问题获取浏览器,而不是服务器来处理,只要有可能,将阻止事件循环的任何处理?这对于node.js应用程序开发来说是一个很好/合理/可行的方法吗?

+0

一年的银行对账单信息实际上不应超过几毫秒来处理客户端或服务器。 – Pointy 2012-02-04 15:05:22

+0

你总是可以使用['process.nextTick()'](http://nodejs.org/docs/latest/api/process.html#process.nextTick)分解服务器端处理,以便它保持响应其他在处理时请求 - 处理几行内容,然后将剩下的工作委托给下一个打勾。 – 2012-02-04 15:10:14

+0

如果有很多类别,每个类别都有数百个可能的匹配,并且每个条目都必须针对每个条目进行测试,但可能需要一段时间。无论如何,不​​是重点......不好的例子,问题更多的是围绕着给客户处理繁重的处理操作的一般方法。 @JoeWhite感谢您的建议..将看看nextTick() – hacklikecrack 2012-02-04 17:05:32

回答

1

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

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

委托或拆分工作负荷是没有办法的。 使用第二个进程(例如第二个节点实例)来执行数字运算服务器端还有一个额外的好处,即允许操作系统使用第二个CPU内核。理想情况下,您可以运行尽可能多的Node实例,因为您在服务器中具有CPU内核,并在它们之间平衡您的工作负载。查看diode module,了解如何在节点中实现多进程通信。

2

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

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


我提出的数据流量将是:

  1. HTTP上传请求
  2. 应用服务器
  3. 通知(原始文件的某处工作进程可以访问保存)以 'CSV' 工作队列
  4. 工作进程上传的csv文件。
相关问题