利用多核CPU

在NodeJs中是以多进程的方式在工作,可充分利用服务器的多核CPU,多核CPU可以并行执行,提供程序的进程

单核CPU和多核CPU的区别

image.pngimage.png
NodeJs的主要任务是作为Web服务,海量请求过多时会造成阻塞 ,出现访问慢,打开失败的情况
image.pngimage.png

  • 多进程是利用多核CPU能并行执行的优点来提高整个服务程序的性能的,一个CPU核在同一时刻只能做一件事情,所以不是进程越多越好。
  • 多个任务分别在不同的进程里执行就不发生相互阻塞可以并行执行,任务就会立即执行然后得到结果。

    守护进程

    守护进程是多进程的另一个作用,来保证整个服务的健壮和稳定
    image.png

  • 在实际的生产环境的Web服务器都是以多进程方式的,目的除了可以提高处理请求的并发能力,另外就是可以管理web服务进程,当出现异常时,程序可以发现并重启新的web服务进程来继续服务,保障服务的健壮和稳定。

  • 守护进程因为是负责创建和管理工作进程的,所以不要实际处理请求,要保证尽量不出现异常,如果守护进程都出现异常了就只能人工重启服务或通过第3方程序来定时发现并重启了。

    创建子进程

    image.png
    image.pngimage.png

  • spawn和exec方法是以异步方式来创建子进程的,它们也有对应同步的方法,一般很少用到。

  • exec是spawn方法的延伸应用,底层是spawn方法来实现的,spawn方法是最灵活强大的。
  • spawn方法创建的子进程,默认是可以通过管道流把数据在父子进程间传递,spawn方法可以通过创建时配置属性来改变标准io流

    创建Node.js子进程

    fork方法专门创建node.js的子进程
    image.pngimage.png

  • fork用于创建Node子进程,但不是说只有fork方法可以创建哦,spawn方法也可以的。

  • 创建Node子进程执行任务是不会阻塞父进程的,可以与父进程并行执行。
  • 进行执行完后触发exit事件,它表示进程结束并退出了。
  • 多进程来分别执行任务一大优势就是可以并行执行,所以所耗的时间肯定不一样啦,多进程肯定快一点。

    进程间传递消息

  • fork创建Node子进程是默认采用IPC与父进程通信的。

  • IPC实际传递的是字符串,所以传递对象时会进行序列化,不可序列化的对象是无法传递的。
  • IPC是全双工通信的,即一端即可接收消息也可以发送消息。
  • Nodejs已经提供了非常方便的API进行消息传递,send方法用于发送消息,message事件接收消息。

image.png

子进程做复杂计算

image.png

创建集群

  • 多个进程进程创建的server是无法监听同一端口的,只有一个server监听成功,其它会报端口被占用
  • 要实现监听同一端口,需要把主进程的server句柄传递给工作进程,实际传递的是句柄对应的文件描述符,在工作进程里再创建一个server,这个server监听到这个文件描述符,这样看起来是共用了一个server,实现了监听同一端口。

image.pngimage.png

轮叫调用

  • Nodejs调度请求默认采用的是系统的抢占式策略,根据的是CPU繁忙度,但处理请求是有一些异步操作是IO密集型,所以会出现不均衡的情况。
  • 在Nodejs中有一种负载均衡的策略叫轮叫高度,它是主进程接收请求后,依次分发给工作进程处理,在Web服务中是IO密集型操作,采用轮叫调度策略是更优的文方案,可以实现整个集群的负载均衡。

    image.pngimage.png

    使用Cluster

    image.png
    自动启用工作进程
    image.pngimage.png