#Node.js

monitorEventLoopDelay 是什么

perf_hooks.monitorEventLoopDelay([options])

  • options: Object
    resolution: The sampling rate in milliseconds. Must be greater than zero. Default: 10.
  • Returns: Histogram

    Creates a Histogram object that samples and reports the event loop delay over time. The delays will be reported in nanoseconds.
    Using a timer to detect approximate event loop delay works because the execution of timers is tied specifically to the lifecycle of the libuv event loop. That is, a delay in the loop will cause a delay in the execution of the timer, and those delays are specifically what this API is intended to detect.

监控 EventLoop 运行情况是判断系统是否健康的重要指标之一,如果有大量的延迟,说明系统存在密集计算,降低了系统的吞吐。Node.js 在 v11 版本引入了monitorEventLoopDelay,而之前需要自己去实现。

Read More

libuv 在 v1.36.0 之后移除了 gyp_uv.py (commit),没办法通过它去创建一个 libuv.a 静态链接库(v1.35 文档有详细的介绍),现在我们需要通过cmake去创建。

构建静态链接库

1
2
3
4
5
6
7
// 下载 libuv
git clone https://github.com/libuv/libuv
cd libuv
mkdir -p build
// DCMAKE_BUILD_TYPE 将其设置为 Debug 模式,不然断点没办法进入 libuv 源码中
(cd build && cmake -DCMAKE_BUILD_TYPE=Debug ..)
cmake --build build

之后 build 目录 如下,libuv_a.a 就是我们需要的 静态链接库。
build dir

新建 hello world 项目

通过 CLion 创建一个helloworld项目,在 CMakeLists.txt 里添加 libuv 相关的信息,将 libuv 的头文件和源码添加进来,最后把项目和 linuv 链接在一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake_minimum_required(VERSION 3.17)
project(helloworld)
add_executable(helloworld main.cpp)

# 前面 clone libuv 绝对路径
set(LIBUVDIR /your/libuv/path)
# 将源码导入
include_directories(${LIBUVDIR}/src)
include_directories(${LIBUVDIR}/include)

add_library(libuv STATIC IMPORTED)
set_target_properties(libuv
PROPERTIES IMPORTED_LOCATION
${LIBUVDIR}/build/libuv_a.a)

# 链接起来
target_link_libraries(helloworld libuv)

创建 main.cpp 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <uv.h>

static void cb(uv_write_t *req, int status) {
printf("Hello from Callback.\n");
}

int main() {
uv_tty_t tty;
uv_write_t req;
uv_tty_init(uv_default_loop(), &tty, 1, 0);
char str[] = "Hello UV!\n";
int len = strlen(str);
uv_buf_t bufs[] = {uv_buf_init(str, len)};
uv_write(&req, (uv_stream_t *) &tty, bufs, 1, cb);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}

之后就能愉快的打断点调试 libuv 了
debug libuv

学习 libuv 或者其它 C/C++相关的技术,感觉又回到了刚开始学习编程的时候,很多的不懂和挑战,不再像用 JavaScript 那样随心所欲,但是越是对底层的学习,越是能了解计算机原理,职业寿命才能变得更长。出于兴趣也好,出于无奈也好,总之新的学习让一切又变得有意思起来。

前文简单梳理了Node.js使用child_process模块创建子进程的4种方法,execexecFileforkspawn。接下来我们看看cluster模块如何创建子进程,后续更多内容会介绍cluster.fork启动Net Server时候为何不会因为共同监听同一个端口而不报错。

cluster

  • fork: 衍生出一个新的工作进程,这只能通过主进程调用。

Read More

Node.js 创建子进程的方法常用的有如下几种:

child_process

  • exec: 衍生一个 shell 然后在该 shell 中执行 command,并缓冲任何产生的输出,最大缓存 1024*1024 个字节。
  • execFile: 函数类似exec,但默认情况下不会衍生 shell。 相反,指定的可执行文件file 会作为新进程直接地衍生,使其比exec 稍微更高效。和exec一样,它也有最大 1024*1204 个字节的显示缓存。
  • fork: 是 spawn的一个特例,专门用于衍生新的 Node.js 进程。 与spawn一样返回ChildProcess对象。 返回的ChildProcess将会内置一个额外的通信通道,允许消息在父进程和子进程之间来回传递。
  • spawn: 上诉的几个方法其实都是通过 spawn 实现的。

cluster

  • fork: 衍生出一个新的工作进程,这只能通过主进程调用。

Read More

在网络上查询libuv和EventLoop相关信息的时候,经常看到不同的文章所表达的意思差距较多,主要原因有二吧:

  • 它们的libuvV8大版本不同,导致具体的实现略有差异
  • 另外它们的代码错综复杂,又是大多数JavaScript工作者不擅长的C/C++,只是从上而下的看,或许一些细节无法完全理解或是认知的分歧

与其受他人影响,不如自己来好好梳理下。

版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// libuv
#define UV_VERSION_MAJOR 1
#define UV_VERSION_MINOR 33
#define UV_VERSION_PATCH 1

// V8
#define V8_MAJOR_VERSION 7
#define V8_MINOR_VERSION 8
#define V8_BUILD_NUMBER 279
#define V8_PATCH_LEVEL 17

// Node.js
#define NODE_MAJOR_VERSION 14
#define NODE_MINOR_VERSION 0
#define NODE_PATCH_VERSION 0

没有列出具体版本号的代码分析都是耍流氓,2010年的代码和2020年的代码可能差距甚远,“上古”分析固然在当时是对的,但是在今日也许是错误的。

Read More

如果你在一家对数据安全性很高的公司工作,团队规定不允许提交数据到第三方服务上,甚至连服务器内存、CPU使用情况等监控数据都不行,那对于像Alinode这样监控和排查问题的大杀器基本都是无福享用了。大多数情况不得不面临自己开发一套类似监控体制去为生产环境保驾护航。

Read More

此文介绍的内容已经算是旧闻了,17年的时候就有大量的文章介绍过了,只是2020年伊始的疫情把人困在家里实在无聊,重新翻来几个视频打发下时间,以下文字算是简单梳理,更多的瑰宝需要我们自己翻阅资料研究,文章中的很多数据应该都过时了吧,仅用来参考吧。

ParerCompiler是2个重要的过程和概念,理解它们可以帮助开发者根据业务需求写出对V8或其它JavaScript引擎更为“友善”的代码,毕竟花在这两个过程中的成本是巨大的。

国外几大网站花在Parser上的时间大约在15-20%

Read More

为了更好的做BFF层,最近看了一些网关资料,Node.js的网关类库相对薄弱很多,主要有2个

和Lua Kong相比缺少很多刚需,比如金丝雀发布、灰度发布等等;和Java Zuul等相比,又少了很多中文文档。但是不管如何这2个是Javascript技术栈的,对于一个Node.js程序工作者来说怎能不香呢?

今天我们主要介绍Express Gateway,背靠强大的Express社区,很多现成的中间件可以运用其中,省去了不少开发成本和风险。一些不是很大的项目或者没有时间慢慢构建底层的团队来说,我觉得可以试试。

Read More

#Preface

This article will introduce the boot of Eggjs that is a Node.js web framework.

It is based on Koa and can satisfy your requirement through a large of plugins and middleware, even a your own framework. It is very important to create a cluster, an agent process and some worker processes when it is running. The cluster makes it stronger. Next, we can understand it by reading the source code.

Eggjs has a few major libs, egg-core、egg、egg-cluster、egg-bin、egg-scripts and so on.

egg-core: it extends Koa and is as a parent object of every agent and worker.

egg: it defines some actions for agent and worker, you can almost use these actions to create an app of a single process.

egg-cluster: it creates a cluster and manages them.

egg-scripts and Egg-bin: their job is run the whole app in a different environment.


Tips: We will discuss Eggjs with basing 2.x.x version.


Read More

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×