nodejs多进程问题?

我们都知道nodejs最大的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Nodejs如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Nodejs进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个cluster模块 ,允许创建“共享同一个socket”的一组进程,用来分担负载压力。本篇文章就基于该cluster模块来讲述Node.js在多核CPU下的编程。

首先贴出一段该模板示例应用代码,接下来进行分析,代码如下

一个请求过来,是给worker进程A处理,还是给worker进程B处理呢?怎么保证大家均等的干活呢?这就是负载均衡的问题。

当前有两种可选的方法来做负载均衡。

早期的cluster是各个worker进程自己去监听socket端口,由操作系统去唤醒worker进程,大家可能很容易认为操作系统会随机的选择worker进程,于是就实现了服务的负载均衡。但实际上,像Linux操作系统总是唤醒某几个进程,因为对于系统来说,上下文切换时很昂贵的操作,唤醒最近被唤醒的进程是比较好的选择。早期的这种方式负载是很不均衡的。

从0.11.2版本开始,cluster开始增加了round-robin模式做负载均衡:master进程负责监听,收到请求后转发给worker进程,多个worker进程轮流干活。round-robin是当前cluster的默认负载均衡处理模式(除了windows平台),如果要回到之前的模式,有两种方式

master进程不会自动管理worker进程的生死,如果worker被外界杀掉了,不会自动重启,只会给master进程发送‘exit’消息,开发者需要自己做好管理。

各个worker进程之间是独立的,为了让多个worker进程共享数据(譬如用户session),一般的做法是在Nodejs之外搭建一个数据库,多个worker进程通过数据库做数据共享。

  • NodeJS是单进程单线程 [1] 结构,适合编写IO密集型的网络应用。为了充分利用多核CPU的计算能力,最直接的...

  • 概述 现行的软件架构主要有两种:单进程多线程(如:memcached、redis、mongodb等)和多进程单线程...

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...

  • Scrum会议 在讲Scrum会议之前我想先介绍一下Scrum.Scrum是一种敏捷软件开发的方法学,用于迭代式增...

  • 一.现在的我越来越少可以走心的朋友,虽然我是从事猎头工作,按理我应该很能“吹水”,能结交很多高端人才,但现实是,很...

  • 我曾无数次的迷失在路上 大街小巷,似乎都找不到我的容身之处 我像是一只蝎子, 在丛林里一只孤独的蝎子。 没有人爱我...

}

本篇文章为大家展示了nodejs中怎么利用cluster实现多进程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

  • node进行多进程的模块;

  1. isWorker属性, 返回该进程是不是工作进程;

  2. fork()方法,只能通过主进程调用,衍生出一个新的worker子进程,返回worker对象;

  1. fork事件,当新的工作进程被fork时触发,可以用来记录工作进程活动;

  2. listening事件,当一个工作进程调用listen()后触发,事件处理器两个参数:worker:工作进程对象, address:包含了链接属性

  • 只有http的服务的listen事件才能触发此事件

  1. message事件,监听子进程的消息;当cluster主进程接收任何工作进程发送的消息时触发;

  • 比较特殊需要在单独的worker上监听;

  1. disconnect事件,当工作进程断开时调用;

这种方式只实现了多进程,多进程运行还涉及父子进程通信,子进程管理,以及等问题,这些特性cluster已经做了处理了;

  • 多个进程间会竞争一个accept连接,产生惊群现象,效率比较低;

  • 由于无法控制一个新的连接由哪个进程来处理,导致worker进程间负载不均衡;

// 响应逻辑,重点关注惊群效果,计数
  • Nginx 是俄罗斯人编写的十分轻量级的http,是一个高性能的HTTP和反向代理服务器,异步非阻塞I/O,而且能够高并发;

  • 正向代理:客户端为代理,服务端不知道代理是谁;

  • 反向代理:服务器为代理,客户端不知道代理是谁;

  • nginx的实际应用场景: 比较适合稳定的服务

守护进程:退出命令窗口之后,服务一直处于运行状态;

round-robin 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器;

  1. 关闭异常worker进程所有的TCP server(将已有的快速断开,且不再接受新的连接),断开和Master的IPC通道,不再接受新的用户请求;

  2. Master立刻fork一个新的worker进程,保证总的进程数量不变;

  3. 异常worker等待一段时间,处理完已接受的请求后退出;

// 断开连接,断开和Master的连接,守护进程其实就是重启;
  • Master进程除了接收新的连接,分发给各worker处理之外,还像天使一样默默守护着这些进程,保障应用的稳定性,一旦某个worker进程退出就fork一个新的子进程顶替上去;

  • 这一切cluster模块已经处理好了,当某个worker进程发生异常退出或者与Master进程失去联系(disconnected)时,master进程都会收到相应的事件通知;

  • IPC通信就是进程间的通信;

  • 虽然每个worker进程是相对独立的,但是他们之间还是需要通信的;叫进程间通信(IPC)通信;

上述内容就是nodejs中怎么利用cluster实现多进程,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

}

我要回帖

更多关于 nodejs开发工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信