说我需要在很多数据中执行以下功能(为了简单起见,假设每个数据都是一个随机词,并且有数十亿个单词)
1)小写单词(假设这需要5ms)
2)在key / val字典中查找单词并将单词转换为val(100ms)
3)将(新)字/ val保存到远程系统(1000ms)
所以我可能会构建一个系统,将工作分成3个桶来平衡整个装配线上的所有操作,包括5个节点来处理桶1,20个节点来处理桶2,以及200个节点来处理桶3。
这可以在node.js中完成吗?也就是说,我可以在n个机器上启动'n'个节点来执行特定功能吗?
注意:我很可能会让node.js节点执行一些(动态)命令对象,这些对象被编码为执行功能1,2,3。
编辑:请注意我的例子是完全捏造的(功能和时间)。我想提供一些具体的例子,但我要问的是,如果node.js是一个很好的框架,用于创建迷你分布式执行引擎,可以根据可编程函数(比如通过脚本化的js)做一些工作量。因此,我可以跨多台机器部署n个node.js进程实例来协作执行我的示例吗?
给定一个大型数据集,5个实例在函数1上运行并将其传递给20个实例以处理函数2并将其传递给100个实例以处理函数3(根据我的示例)
答案 0 :(得分:0)
在Javascript中,执行函数通常不需要很长时间。它有时候看起来有点像,但它常常像登录控制台那样需要几毫秒。
我拿了你的例子并围绕它开发了一些代码:
var valStore = {
hello: 'world'
};
var word = 'HELLO';
var start = new Date().getTime();
word = word.toLowerCase();
var val = valStore[word];
var end = new Date().getTime();
console.log(val);
console.log(end - start);
小写单词: 0ms
在key / val词典中查找单词: 0ms
将单词保存到远程系统:可能大约100ms ,但这没关系。
正如您所看到的,这些函数的执行时间不到一毫秒。当然,这些是简单的,非计算密集型的功能。如果你有一个执行时间超过500毫秒的函数,那就是我开始考虑将它卸载到另一个线程。
Node.js背后的整个想法源于这样一个事实,即与cpu绑定任务相比,I / O操作需要相当长的时间才能执行。
供参考(在CPU循环中):
L1缓存: 3 周期
二级缓存: 14 周期
RAM: 250 周期
磁盘: 41,000,000 周期
网络: 240,000,000 周期
Node.js尝试通过在开始执行更多任务之前等待从磁盘/网络收听来解决此I / O问题。这是可能的,因为Javascript事件循环堆叠了一堆函数以提前执行。
这是菲利普罗伯茨的精彩视频,详细解释了事件循环:
https://www.youtube.com/watch?v=8aGhZQkoFbQ
Callbacks / Promises在这个“不等待”中发挥了重要作用,因为现在我们可以访问RAM 960,000(240,000,000 / 250)次而不浪费任何CPU周期,而不必等待服务器的响应。当服务器最终'给我们回电'时,我们知道该做什么因为我们之前做的回调函数。这个回调函数保持与它所用的函数相同的范围,所以我们可以假装(至少可以说)就像调用它的原始函数一样,只是稍后执行。
无论如何,使用你的例子,我们可以转换大量的单词,进行一堆查找,并在同一台服务器上向远程系统发出一堆请求,而不会有太多麻烦。事实上,让一堆机器同时完成所有这三件事情可能更有意义。这将是一种更合理的方式来接近您所追求的分布式系统架构。
这样做的好方法是通过微服务,链接是Matt Smith的介绍性讲话:
https://www.youtube.com/watch?v=Drs4e_Z5_70
对于动态方面,您可能希望Express.js帮助您为要执行的各种功能制作一些HTTP API端点。
快乐的编码!