Node.js之async_hooks

简介: Node.js之async_hooks

async_hooks,即异步钩子,看看这个API到底能帮我做些什么。

1. async_hooks基本用法

async_hooks API 能使我们追踪资源(resource)变得更加简单,只需要使用init、before、after、destroy这些回调函数去初始化 async_hooks 接口。

var asyncHooks = require('async_hooks')
var hooks = {
  init: init,
  before: before, 
  after: after,
  destroy: destroy
}
var asyncHook = asyncHooks.createHook(hooks)

通过createHook、enable、disable方法可以创建async_hooks、开始追踪、停止追踪:
这里写图片描述
async_hooks 基于一种resource的概念,一个resource会触发上面提到的async_hooks的回调函数。这种resource可以是TTYWRAP 、SSLCONNECTION 或者任何使用 Embedder API 定义的内容(稍后会提到)。如果要使用 http.createServer() 创建一个 server,我们可以看看async_hooks API的init回调函数的resource,代码如下:

var asyncHooks = require('async_hooks')
var http = require('http')
var fs = require('fs')
var hooks = {
  init: init
}
var asyncHook = asyncHooks.createHook(hooks)
asyncHook.enable()
http.createServer(function (req, res) {
  res.end('hello qts')
}).listen(8079)
function init (asyncId, type, triggerId) {
    fs.writeSync(1, `${type} \n`)
}

2. function init (asyncId, type, triggerId) {}

async_hooks init callback :
async_hooks init callback

init回调函数或许是最有趣的一个回调,它允许我们访问当前resource(current resource),并看看是什么原因触发了它。这就意味着我们最终能创建一个良好的结构来查看我们的应用程序中到底发生了什么。
这里写图片描述

我认为这是一个很棒的trace跟踪方法 : 在init中拿到 asyncId 和 triggerId,启动一个计时器去跟踪一些操作,最后在destroy回调中销毁计时器。按照这个思路,我写了一个 on-async-hook,一个简单的async_hook跟踪事件发射器。

当async_hooks调用init回调函数时,on-async-hook会创建一个trace跟踪,并且根据他们的triggerId来组合 resource。我想给操作计时,因此 on-async-hook 的跟踪结构还包含了开始时间和结束时间,也就是在init、destroy中进行添加和销毁计时器。一个简单的使用 on-async-hook 进行跟踪的结果

3. Embedder API

如果要绑定本地的C++代码,则可能需要自定义resource,这一点可以使用Node 8 提供的实验性 Embedder API 做到。下面是一个例子,使用的是utp-native:

var AsyncResource = require('async_hooks').AsyncResource
var utp = require('utp-native')
var resource = new AsyncResource('UTPNative')
var server = utp.createServer(function (socket) {
  socket.pipe(socket)
})
server.listen(1337, function () {
  var socket = utp.connect(1337)
  resource.emitBefore()
  socket.write('hello qts')
  resource.emitAfter()
  socket.on('data', function (data) {
    console.log('resourceId', resource.asyncId())
    console.log('triggerAsyncId', resource.triggerAsyncId())
    console.log('this is my data ', data)
  })
})
server.on('close', function () {
  resource.emitDestroy()
})

4. 展望

async_hooks仍然是一个实验性很强的API,它在接下来的时间中可能会不断变化,比如async_hooks.currentId()变成了async_hooks.executionAsyncId() ,但它能为我们提供一种新方法去监视程序,这点就非常炫酷了!

目录
相关文章
|
10月前
|
存储 JavaScript 安全
Node中的AsyncLocalStorage 使用问题之AsyncLocalStorage与node:async_hooks模块的问题如何解决
Node中的AsyncLocalStorage 使用问题之AsyncLocalStorage与node:async_hooks模块的问题如何解决
114 3
|
10月前
|
存储 JavaScript 安全
Node中的AsyncLocalStorage 使用问题之生产环境中使用async_hooks的问题如何解决
Node中的AsyncLocalStorage 使用问题之生产环境中使用async_hooks的问题如何解决
|
10月前
|
存储 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之使用async_hooks的问题如何解决
Node中的AsyncLocalStorage 使用问题之使用async_hooks的问题如何解决
|
3月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
2月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
696 24
|
3月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
74 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
3月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
|
2月前
|
数据库
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
|
4月前
|
JavaScript
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
696 26
|
6月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
350 58