没有合适的资源?快使用搜索试试~ 我知道了~
详解通过源码解析Node.js中cluster模块的主要功能实现
0 下载量 174 浏览量
2021-01-20
07:30:46
上传
评论
收藏 73KB PDF 举报
温馨提示
众所周知,Node.js中的JavaScript代码执行在单线程中,非常脆弱,一旦出现了未捕获的异常,那么整个应用就会崩溃。这在许多场景下,尤其是web应用中,是无法忍受的。通常的解决方案,便是使用Node.js中自带的cluster模块,以master-worker模式启动多个应用实例。然而大家在享受cluster模块带来的福祉的同时,不少人也开始好奇: 为什么我的应用代码中明明有app.listen(port);,但cluter模块在多次fork这份代码时,却没有报端口已被占用? Master是如何将接收的请求传递至worker中进行处理然后响应的? 让我们从Node.js项目的l
资源推荐
资源详情
资源评论
详解通过源码解析详解通过源码解析Node.js中中cluster模块的主要功能实现模块的主要功能实现
众所周知,Node.js中的JavaScript代码执行在单线程中,非常脆弱,一旦出现了未捕获的异常,那么整个应用就会崩溃。这
在许多场景下,尤其是web应用中,是无法忍受的。通常的解决方案,便是使用Node.js中自带的cluster模块,以master-
worker模式启动多个应用实例。然而大家在享受cluster模块带来的福祉的同时,不少人也开始好奇:
为什么我的应用代码中明明有app.listen(port);,但cluter模块在多次fork这份代码时,却没有报端口已被占用?
Master是如何将接收的请求传递至worker中进行处理然后响应的?
让我们从Node.js项目的lib/cluster.js中的代码里,来一勘究竟。
问题一问题一
为了得到这个问题的解答,我们先从worker进程的初始化看起,master进程在fork工作进程时,会为其附上环境变量
NODE_UNIQUE_ID,是一个从零开始的递增数:
// lib/cluster.js
// ...
function createWorkerProcess(id, env) {
// ...
workerEnv.NODE_UNIQUE_ID = '' + id;
// ...
return fork(cluster.settings.exec, cluster.settings.args, {
env: workerEnv,
silent: cluster.settings.silent,
execArgv: execArgv,
gid: cluster.settings.gid,
uid: cluster.settings.uid
});
}
随后Node.js在初始化时,会根据该环境变量,来判断该进程是否为cluster模块fork出的工作进程,若是,则执行workerInit()函
数来初始化环境,否则执行masterInit()函数。
在workerInit()函数中,定义了cluster._getServer方法,这个方法在任何net.Server实例的listen方法中,会被调用:
// lib/net.js
// ...
function listen(self, address, port, addressType, backlog, fd, exclusive) {
exclusive = !!exclusive;
if (!cluster) cluster = require('cluster');
if (cluster.isMaster || exclusive) {
self._listen2(address, port, addressType, backlog, fd);
return;
}
cluster._getServer(self, {
address: address,
port: port,
addressType: addressType,
fd: fd,
flags: 0
}, cb);
function cb(err, handle) {
// ...
self._handle = handle;
self._listen2(address, port, addressType, backlog, fd);
}
}
你可能已经猜到,问题一的答案,就在这个cluster._getServer函数的代码中。它主要干了两件事:
资源评论
weixin_38670529
- 粉丝: 3
- 资源: 927
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功