Nolan's Blog

盘点我的2022

我的2022

2022 注定是一个不平凡的年份,我们生在历史的洪流中,见证着,也创造着历史。这个历史无论是于世界于国家,还是于家庭于自己,都将成为一份记忆。 这一年,不得不谈一谈疫情。这是疫情开始的第三年,每个人都已习惯了带口罩的日子,后面做核酸竟然也成为了常态。疫情影响,自己在深圳陪老婆过年,儿子则被奶奶带回了山东老家。儿子出生的第一年年末,疫情就来了,可以说,他的成长中一直伴随着疫情。新年年初,每个...

V8引擎

JS引擎的执行过程及垃圾回收

【译】JavaScript 工作原理:V8 编译器的优化 Deoptimization in V8 一、什么是 V8 JS & WebAssembly 引擎; 使用 C++ 编写; 可独立运行,也可被任何 C++ 应用调用; 发展 2008 年,发布并开源; 2010 年,支持 JIT; ...

Node.js 中的事件循环

Node.js 中的事件循环

在 node.js 中,事件循环是 libuv 提供的能力。启动 node.js , 会开启一个进程。 事件循环会检测有无任务,如果没有任务时,进程就会退出。比如,执行 node main.js ,而 main.js 仅有一行 console ,执行完就自动退出进程了。 而当 node.js 提供 TCP 服务监听某一端口时,就不会退出进程。 执行完传入的 js, 就进入下图事件循环的某...

Node.js 进程间通信IPC

Node.js 进程间通信IPC

IPC(Inter-Process Communication),即进程间通信,目的是让不同进程能互相访问资源,并进行协调工作。 实现 IPC 的技术有很多,比如: 命名(匿名)管道 socket(通过网络 socket 互相发送也是一种 IPC) 信号量 共享内存 消息队列 UDS(Unix Domain Socket) 但以上的方式中,除了信号(操作系统...

UDS

Nodejs 与 Unix Domain Socket

参考 Node.js HTTP Server 监听 Unix Socket 套接字 | Unix 域协议 一、什么是 Socket 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。Socket 可以被定义描述为两个应用通信通道的端点,一个 Socket 端点可以用 Socket 地址(地址 IP、端口、协议组成)来描述。Socket 作...

Node.js进程模型

Node.js进程模型

Node.js 内核的幕后英雄 — 子线程 libuv 线程池 最为人所知的子线程。Libuv 用来处理文件 IO、DNS 和 CPU 密集型的任务。 以异步读取文件为例: 主线程提交任务给线程池后,就可以继续执行其他操作而不需要等待子线程完成,子线程完成任务后会以异步的方式通知主线程。 Workers 利用 node.js 提供的 worker_threads 模块...

登录问题排查

记一次登录问题的排查思路

背景 昨天下午上线了 gas-admin 的 node 服务,今天上午 QA 在回归时发现一个问题,表现为,点击退出登录后,页面反复刷新,无法正常进入网站。 此时,赶紧采取降级策略, 将 web 页面调用的 node 接口,改为调用原后端接口。(代码改动量上,就是调用接口地址字符串的 v1 改为 v2,当然前端有接入配置中心的话,直接在配置中心修改会更方便) 做服务应用时,降级思维是多...

S3上传问题排查

记一次上传S3失败问题的排查思路

背景 在 Ads-Admin-V2.0 需求中,有一个功能点是将报表数据导出为 csv 。其中,要求在导出的 csv 头部添加一些导出信息的元信息,如 Time Range 和 Download Time 等,即上图中灰色文字部分。 导出流程梳理 node 收到导出请求,查询 clickhouse,得到可读流 chReadableStream; node 将可读流数据...

大文件下载转发问题排查

记一次大文件下载问题的排查思路

需求 nodejs 作为中间层提供接口转发,后端已提供 http 下载接口,node 层通过 axios 调用后端接口,并转发给前端。 当下载小文件时,无问题。 下载大文件(几十 M)时,会出现一直 loading 的截图。 分析 一开始怀疑后端接口本身有问题,替换成页面直接调用后端接口,表现如下: 立马出现下载弹窗; 点击下载后,浏览器关闭页面,进行下载,但是下载看上去是断...

实现一个RPC调用sdk

如何实现一个RPC调用sdk

公司内部基于 grpc 框架进一步封装了一个自有框架,这里称作 spex,但是没有提供 nodejs 调用的 sdk,只是提供了调用规范。 需要开发一个 nodejs 版本的 spex client, 基本功能包括: cli 能力(支持根据 proto 文件生成 js 和 ts 调用代码) 调用 spex service 能力(暂不支持作为被调方) ...