Node.js是在V8上面构建的,是一个单线程的结构,但现在的CPU都是多核的,这就抛出了一个问题:如何充分地利用多核CPU服务器?另外一个比较棘手的问题是,由于Node执行在单线程上,一旦单线程上抛出的异常没有被捕获,将会引起整个进程的崩溃,第二个问题就是如何保证进程的健壮性和稳定性?
对于第一个问题,我们可以启动多进程,理想状态每一个进程利用一个CPU,以实现多核的利用。最有名的Master-Worker模式,也就是主从模式,它分成两种:主进程和工作进程。主进程不负责具体的业务处理,只负责调度和管理工作进程,它是趋于稳定的。工作进程负责具体的业务处理,因为业务的多种多样,甚至一项业务由多个开发者完成,所以工作进程的稳定性需要开发者关注。
Node.js提供了child_process模块用于创建子进程,它提供了4个方法:spawn(),exec(), execFile(), fork(),分别表示的含义是:启动一个子进程来执行命令、启动一个子进程来执行命令且具有回调函数、启动一个子进程来执行可执行文件、启动一个子进程来执行命令而且只需要指定的js文件模块。
至于如何让进程保持健壮性和稳定性,主要有三个方法。我们的进程对象还自带一些标志事件,比如error、exit、close、disconnect,在进程收到响应信号的时候,应该做出一些约定的行为,这样可以保证程序的稳定性和可追溯性,比如写下相应的日志,定位错误,或者进行一些数据库的操作,做到优雅的关闭进程。第二个办法是设置自动重启,当监听到进程的exit事件之后,我们可以重启一个进程来继续服务,因为在实际的业务当中,有一些隐藏的bug会导致进程退出,所以我们需要仔细地进行这种异常的处理,这里需要注意,不能等到所有连接都断开之后才重启,如果是这样的话,新来的请求都可能因为没有进程来服务而丢失掉大部分的请求,这样是不合理的。第三个方法是使用负载均衡的技术,使得用户的请求均匀地分散到多个进程上处理,这样可以将CPU的资源都调用起来,保证每个处理单元都得到相同的工作量。
网友评论