发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

Node.js V0.12 新特性之在单进程中跑多个实例

  • 2014-04-01
  • 本文字数:1962 字

    阅读完需:约 6 分钟

实例

经常有人提出,希望 Node.js 能被嵌入到其他程序中,特别是让它能跟其他事件循环整合而且(与此同时)支持多个 Node 执行情境:也就是说让多个 Node 实例在同一个进程中和平共处的能力。想象一下,比如有个 node-webkit 程序,每个窗口都运行在自己的 Node 实例上,各窗口彼此相互独立。或者把 Node 嵌在手机或网络交换机里,处理多连接的路由逻辑,但却只是在单个进程中,并且不久的将来就能实现。

一个客户找到我们,说他们的程序需要这类功能。他们经过调研,肯定了我们在 Node 核心和 libuv 上的贡献和专业能力,决定请我们帮忙。这是个相当有挑战性的订单,因为Node 一开始就是- 并且现在仍然是- 一个单线程的程序,围绕着单一事件循环的概念构建,用上百个全局变量存放各种状态。

你可以想象一下,在这样的代码库上加装线程安全是多么容易出错的任务,所以那不是我们要做的- 或者说我们还没那么做。我们希望这个修改对客户来说经济实惠,并且向前迈出这一步也能帮到整个社区。顺便说一下,如果你发现自己需要对Node 做些修改,可自己又没时间研究该怎么改,我们可以帮忙!

引入多情境

实际上,我们在Node v0.12 中实现了在同一个事件循环中使用多个执行情境的能力。别担心:对普通用户来说并没有显性的变化,一切都和以前一样。但如果你是嵌入开发人员,或本地附加组件作者,请继续往下看!

提交 756b622 中的“多情境”工作是第一次,也是最重要的清理任务:它把所有全局变量审了一遍,首先去掉了那些不需要放在全局中的变量,并将剩下的变成了执行情境的属性。虽然那还不足以保证线程安全,但这第一步很重要。

第二步是让 Node 内部意识到多执行情境的存在。C++ 运行时在任何地方进入 V8 VM,都要先确保它进入的是正确的情境。下面是一个简单的例子:

复制代码
function onconnect() {
this.write('GET / HTTP/1.1\r\n' +
'Host: strongloop.com\r\n' +
'\r\n');
this.pipe(process.stdout);
}
require('net').connect(80, 'strongloop.com', onconnect);

Execution-wise,差不多应该是这个样子的:

复制代码
<enter VM>
connect(80, 'strongloop.com'); // kernel reports EINPROGRESS here
<leave VM>
<wait for TCP handshake to complete>
<enter VM>
onconnect();
<leave vm>

在进入 VM 的调用之间可能会改变执行情境。因此 connect() 有必要记住当前情境,并且调用 onconnect() 能恢复它。如果做不到这一点,追踪 bug 将会变得极其困难。

好在 Node 可以自动把这个处理好;嵌入开发人员和本地附加组件作者不需要担心这个,除非他们想用 v8::Function::Call() 代替 node::MakeCallback() 进入 VM 做调用。

如果你是本地附加组件作者,想让你的附件组件具备识别情境的能力,你需要:

复制代码
* Instead of NODE_MODULE(), use
NODE_MODULE_CONTEXT_AWARE(). Before:
void Initialize(v8::Handle<v8::Object> exports) {
// ...
}
NODE_MODULE(foo, Initialize)

之后:

复制代码
void Initialize(v8::Handle<v8::Object> exports,
v8::Handle<v8::Value> module,
v8::Handle<v8::Context> context) {
// ...
}
NODE_MODULE_CONTEXT_AWARE(foo, Initialize);

能识别情境的初始化方法在嵌入创建的每个情境都会被调用一次。现在还没有各情境的清理函数,最终会由 node::AtExit() 承担这一职责,但目前还是一个针对进程的事件。如果对你来说这样不行,请在这里提交个bug。

将全局变量变成各情境的属性有几种办法,其中一个是为你自己宣称一个嵌入数据索引,并把所有东西都存在那里。

这些索引还没有全局注册表,所以仍有发生冲突的可能。有没有想试着给打个补丁?同时挑一个差不多大的随机数(比如2^10 到2^16 之间的),但不要太极端:V8 用一个非稀疏矩阵作为嵌入索引的内部存储。将索引宣称为1 << 29 就会消耗很多内存!

还有多少工作要做?

这里还有些粗糙的边界需要打磨:process.chdir() 会改变所有情境的工作目录,但实际上应该只改变调用它的情境的工作目录;从多情境中加载附加组件还有些边界情况,等等诸如此类的地方。但那属于修修补补力求尽善尽美的工作了。基本框架已经到位了,并且那家赞助我们开发多情境特性的公司已经成功地用上它了。更重要的是,它为多线程多重租赁铺平了道路。那在Node v0.12 之前不太可能发生了,但我们可能会在Node v1.0 或另一个版本中见到它- 只要我们敢!

作者简介

本文最初由 Ben Noordhuis 发表在 StrongLoop 上。Ben Noordhuis 从 2010 年就跟着 Ryan Dahl 开发 Node.js 的核心代码。他一直在为改进 Node 核心代码而努力做着编码、调试和基准测试等工作。作为最高产的 Node 核心开发者之一,Ben 编写了 Node.js 和 libuv 中的很多代码。 StrongLoop 降低了在 Node 中开发APIs 的难度,还添加了监测、集群化以及私有注册的支持等DevOps 能力。

查看英文原文: What’s New in Node.js v0.12 – Running Multiple Instances in a Single Process

2014-04-01 22:564091
用户头像

发布了 45 篇内容, 共 24.3 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

系统天气再现bug 网友:墨迹天气赶紧上!

Geek_2d6073

6步带你用Spring Boot开发出商城高并发秒杀系统

华为云开发者联盟

高并发 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

Serverless冷启动:如何让函数计算更快更强?

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

国产数字化升级工具强势来袭,瓴羊Quick BI工具免费试用

对不起该用户已成仙‖

NCH Switch Plus mac版:音频转换工具

Rose

全能音频格式转换 Switch Plus NCH 软件 NCH Switch Plus mac版

MarsEdit for Mac 快速方便的博客编辑器

Rose

mac软件下载 MarsEdit下载 博客写作软件

高新技术产业包括哪些?拥有高新企业证书说明什么?

行云管家

高新企业 高新技术 高新

ByteHouse技术白皮书正式发布,云数仓核心技术能力首次全面解读(内附下载链接)

字节跳动数据平台

数据仓库 云原生 白皮书 数据存储 企业号 4 月 PK 榜

音视频处理MCP:视频版权保护

百度开发者中心

音视频 智能视频 视频版权保护

物联网核心套件IoTCore:设备状态数据存储到时序数据库TSDB

百度开发者中心

物联网

2023年郑州市等级保护测评机构名单汇总

行云管家

等保 郑州 等保测评机构

适用于所有 Mac 的温度监控、风扇控制和诊断:TG Pro

Rose

Mac硬件温度检测 TG Pro for mac 苹果软件资源站 macw软件站

音视频处理MCP:视频添加字幕

百度开发者中心

视频 音视频开发 智能视频

一键快速切换工具:One Switch 1.29中文版

真大的脸盆

Mac Mac 软件 切换工具 一键切换

基于ArkUI框架开发-ImageKnife渲染层重构

OpenHarmony开发者

火山引擎DataLeap:3小时分享,体系化讲透企业数据治理如何做?

字节跳动数据平台

活动 数据治理 论坛 数据研发 企业号 4 月 PK 榜

云原生月报丨阿里云云原生月度动态(202303)

阿里巴巴云原生

阿里云 云原生 月报

Reactor线程模型的演进和局部无锁化

做梦都在改BUG

面试官:聊一聊Spring中Bean的作用域

做梦都在改BUG

Java spring bean

GPT会上网了,ChatGPT插件的原理揭秘

Apifox

人工智能 程序员 OpenAPI openai ChatGPT

“阿里味”GitHub上新软件架构设计与业务架构融合手册

做梦都在改BUG

Java 架构 架构设计

MySQL 驱动中虚引用 GC 耗时优化与源码分析

PPPHUANG

MySQL 性能优化 JVM

2023最新1200道JAVA面试题(超全面!超系统!超实用!)早做准备,早上岸!

架构师之道

Java 编程

生物计算大模型技术在药物研发领域的应用

百度开发者中心

人工智能 文心 ERNIE 生物医药

生成式AI已形成全球性“AI再造业务”趋势

百度开发者中心

#人工智能 文心一言 文心一格

新浪顶级架构师保驾护航!国内首本大型分布式架构笔记浴火新生

做梦都在改BUG

Java 架构 分布式

2023年最新大厂金三银四必问1200道Java面试题,面面俱到!太全了

采菊东篱下

Java

大咖直播专场 | 当人工智能遇到数据库

KaiwuDB

KaiwuDB DB4AI AI4DB

One Switch:Mac上一个集合一键切换系统各项功能的神奇菜单

Rose

Mac软件 苹果软件下载 One Switch Mac资源站

硬核!互联网资深大佬手码高并发编程速成笔记(2023版)限时开源

三十而立

Java IT java面试

微前端架构:将应用拆分为多个小型模块,实现模块化设计

没有用户名丶

小程序容器

Node.js V0.12新特性之在单进程中跑多个实例_架构/框架_Ben Noordhuis_InfoQ精选文章