TODO:浅谈pm2基本工作原理

要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系。

撒旦(Satan),主要指《圣经》中的堕天使(也称堕天使撒旦),他是反叛上帝耶和华的堕天使(Fallen Angels),曾经是上帝座前的天使,后来他因骄傲自大妄想与神同等而堕落成为魔鬼,被看作与上帝的力量相对的邪恶、黑暗之源。

简单的说Satan是破坏神,就是进程的异常退出、kill等;God是守护神,保护进程、重启进程等。

一图胜千言,pm2的 RPC基本框架。Client与Daemon是采用了RPC进行通讯。

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

1. Client启动关联Daemon

daemon.innerStart(function() {

KMDaemon.launchAndInteract(that.conf, {

machine_name : that.machine_name,

public_key : that.public_key,

secret_key : that.secret_key

}, function(err, data, interactor_proc) {

that.interactor_process = interactor_proc;

});

that.launchRPC(function(err, meta) {

return cb(null, {

daemon_mode : that.conf.daemon_mode,

new_pm2_instance : false,

rpc_socket_file : that.rpc_socket_file,

pub_socket_file : that.pub_socket_file,

pm2_home : that.pm2_home

});

});

});

child.once(‘message’, function(msg) {

debug(‘PM2 daemon launched with return message: ‘, msg);

child.removeListener(‘error’, onError);

child.disconnect();

if (opts && opts.interactor == false)

return cb(null, child);

/**

* Here the Keymetrics agent is launched automaticcaly if

* it has been already configured before (via pm2 link)

*/

KMDaemon.launchAndInteract(that.conf, {

machine_name : that.machine_name,

public_key : that.public_key,

secret_key : that.secret_key

}, function(err, data, interactor_proc) {

that.interactor_process = interactor_proc;

return cb(null, child);

});

});

2. Daemon有start,stop,close,kill进程的方法,与God的事件发射器(EventEmitter)关联

God.bus.on(‘axm:monitor’, function axmMonitor(msg) {

if (!msg.process)

return console.error(‘[axm:monitor] no process defined’);

if (!msg.process || !God.clusters_db[msg.process.pm_id])

return console.error(‘Unknown id %s’, msg.process.pm_id);

util._extend(God.clusters_db[msg.process.pm_id].pm2_env.axm_monitor, Utility.clone(msg.data));

msg = null;

});

3. Satan.js

3.1. Ping进程是否活着或者关闭

Satan.pingDaemon = function pingDaemon(cb) {

var req = axon.socket(‘req’);

var client = new rpc.Client(req);

debug(‘[PING PM2] Trying to connect to server’);

client.sock.once(‘reconnect attempt’, function() {

client.sock.close();

debug(‘Daemon not launched’);

process.nextTick(function() {

return cb(false);

});

});

client.sock.once(‘connect’, function() {

client.sock.once(‘close’, function() {

return cb(true);

});

client.sock.close();

debug(‘Daemon alive’);

});

req.connect(cst.DAEMON_RPC_PORT);

};

3.2. 通知God

Satan.notifyGod = function(action_name, id, cb) {

Satan.executeRemote(‘notifyByProcessId’, {

id : id,

action_name : action_name,

manually : true

}, function() {

debug(‘God notified’);

return cb ? cb() : false;

});

};

4. God是事件监听

var God = module.exports = {

next_id : 0,

clusters_db : {},

bus : new EventEmitter2({

wildcard: true,

delimiter: ‘:’,

maxListeners: 1000

})

};

5. God的监听进程方法有

God.ping

God.notifyKillPM2

God.duplicateProcessId

God.startProcessId

God.stopProcessId

God.resetMetaProcessId

God.deleteProcessId

God.restartProcessId

God.restartProcessName

God.sendSignalToProcessId

God.sendSignalToProcessName

God.stopWatch

God.toggleWatch

God.startWatch

God.reloadLogs

God.sendDataToProcessId

God.msgProcess

God.getVersion

6. God的进程运行模式用两种

6.1. Cluster集群模式

6.2. Fork模式

一般开发环境用fork模式,生产环境使用cluster模式

简单pm2进程管理描述,更多方法请阅读源码。



wxgzh:ludong86

时间: 2024-08-11 12:39:39

TODO:浅谈pm2基本工作原理的相关文章

[转自SA]浅谈nginx的工作原理和使用

nginx apache 简单对比 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单 社区活跃 配置简洁 apache 相对nginx 的优点: rewrite ,比 nginx 的 rewrite 强大 模块超多 少 bug ,nginx 的 bug 相对较多 超稳定 配置复杂

浅谈JSONP 的工作原理

小编最近在工作中经常用到 jsonp 这个东西, 表示之前从来没用过  最近稍微研究了下 当然很多内容来源于网上 收集整理 你懂的 ~~~ 话说我们访问一个页面的时候 需要像另一个网站获取部分信息, 这就是所谓的跨域请求才能完成的功能, 现实生活中有很多 比如引入外部js, img 等等, 说到发送请求, 在web2.0的时代 我们避免不了 ajax 请求了, 当然我们在 工作中用到 ajax 跨域请求 是必须遇到的,当然ajax 是不支持跨域请求的 说到这里我比较汗颜啊, 当然天无绝人之路,有

浅谈计算机程序的工作过程

---------------------------------------------------------------------------------------------------------------------------------------- 本文为<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000.第一课课后作业.学生姓名:刘征 本文主要内容是写一个简单的C语言程序,将其转换成汇编代

浅谈软件销售工作

自技术领域转做销售有几年了.由于长期耕耘在技术领域,对于销售的角色进入有点晚,只是近期几年也逐渐的摸出些门道,而且按照这些门道来指导团队的实践,确实可以看到比較可喜的进步,在此总结一下.跟大家一起分享一下. 销售分为例如以下三种类型:1. 技术型销售.典型特征是逢人必谈技术,对于技术的内因外果非常清楚,当跟客户沟通时特别在技术沟通时,能说会道,涛涛不绝.但一到关系项目譬如玩.喝酒.K歌等表现平平.2. 关系型销售.典型特征是碰到人必称"哥"."老师"."领

浅谈JavaScript DDOS 攻击原理与防御

前言 DDoS(又名"分布式拒绝服务")攻击历史由来已久,但却被黑客广泛应用.我们可以这样定义典型的DDoS攻击:攻击者指使大量主机向服务器发送数据,直到超出处理能力进而无暇处理正常用户的合法请求,最终导致用户无法正常访问网站. 近年来,DDoS攻击手段已日趋多元化——攻击者通过各种奇技淫巧诱使不知情主机参加攻击.比如,[注1]历史上数据量最大(超过400Gbps)的DDoS攻击就是通过[注2]NTP反射完成的.时至今日,我们已经发现一个令人不安的趋势:攻击者通过恶意的JavaScri

浅谈redux 中间件的原理

在使用redux管理异步数据流的时候,我们会使用中间件,以redux-thunk中间件为例,我们做一下分析: 首先是构建store,我们需要以下代码进行揉入中间件的类似creatStore函数的构造: const loggerMiddleware = createLogger(); const createStoreWithMiddleware = applyMiddleware( thunkMiddleware, loggerMiddleware )(createStore); export

JAVA NIO之浅谈内存映射文件原理与DirectMemory

Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数  read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有

浅谈JavaScript预编译原理

这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作: 1,语法分析: 2,预编译: 3,解释执行. 语法分析很简单,就是引擎会简单的检查一下你的代码有没有什么低级的错误,解释执行就是执行代码,执行代码之前会进行预编译,预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数.下面我详细说一下: 预编译可以简单的分成全局预编译和函数体预编译,函数体预编译可以从四个规则入手; 1,创建AO对象;AO{ 

浅谈HashMap 的底层原理

本文整理自漫画:什么是HashMap? -小灰的文章 .已获得作者授权. HashMap 是一个用于存储Key-Value 键值对的集合,每一个键值对也叫做Entry.这些个Entry 分散存储在一个数组当中,这个数组就是HashMap 的主干. HashMap 数组每一个元素的初始值都是Null. 1. Put 方法的原理 调用Put方法的时候发生了什么呢? 比如调用 hashMap.put("apple", 0) ,插入一个Key为"apple"的元素.这时候我