将数据库工作移动到子进程是一个好主意在node.js?

时间:2017-10-06 16:29:37

标签: javascript node.js child-process

我刚开始进入child_process,我所知道的是,将阻塞函数(例如循环大数组)委托给子进程是有好处的。

我使用typeorm与mysql数据库进行通信。我想知道将一些异步数据库工作转移到子进程是否有好处。我在另一个帖子中读到它(不幸的是我无法在浏览器历史记录中找到它),没有充分的理由将异步函数委托给子进程。这是真的吗?

示例代码:

child.js

import {createConnection} "./dbConnection";
import {SomeTable} from "./entity/SomeTable";

process.on('message', (m)=> {
    createConnection().then(async connection=>{
        let repository = connection.getRepository(SomeTable);
        let results = await repository
            .createQueryBuilder("t")
            .orderBy("t.postId", "DESC")
            .getMany();

        process.send(results);
    })
});

main.js

const cp = require('child_process');
const child = cp.fork('./child.js');
child.send('Please fetch some data');
child.on('message', (m)=>{
      console.log(m);
});

1 个答案:

答案 0 :(得分:2)

关于Javascript的巨大收获是它的异步性......

调用异步函数时会发生的是代码继续执行,而不是等待答案。只是当功能完成后,给出答案,然后继续该部分。

您的数据库调用已异步。所以你会完全没有产生另一个节点进程。由于您的数据库充满了热量,因此拥有更多nodeJS流程对该部分没有帮助。

采用相同的示例,但文件写入。什么可以使写入磁盘更快?真的没什么......但我们在乎吗?不,因为我们的NodeJS没有被阻止,并且不断回答请求和处理任务。您可能要检查的唯一事情是不要同时发送一千个文件写入,如果它们很大则会对文件系统产生负面影响,但由于写入不是CPU密集型,因此节点将仅运行细

子进程确实是一个很好的工具,但很少需要它。当我听到它们时我也想使用一些,但问题是你根本不需要它们......我决定使用它的唯一一次是创建一个CPU密集型工作者。它将确保它为每个Core生成一个子进程(因为节点是单线程的)并重新生成任何有缺陷的进程。