• 技术文章 >web前端 >js教程

    什么是异步资源?浅析Node实现异步资源上下文共享的方法

    青灯夜游青灯夜游2022-06-01 21:15:38转载133
    Node.js 如何实现异步资源上下文共享?下面本篇文章给大家介绍一下Node实现异步资源上下文共享的方法,聊聊异步资源上下文共享对我们来说有什么用,希望对大家有所帮助!

    异步资源上下文共享,意味在一次网络请求生命周期或异步资源调用链中共享上下文数据。

    回答这个问题之前,首先我们要先理解什么是异步资源。

    异步资源

    异步资源可以理解为是有回调的对象,比如但不限于 Promises、Timeouts、TCPWrap、UDP 等。详见异步资源的类型列表

    官方定义如下:

    An asynchronous resource represents an object with an associated callback. This callback may be called multiple times, such as the 'connection' event in net.createServer(), or just a single time like in fs.open(). A resource can also be closed before the callback is called.

    AsyncLocalStorage

    这里介绍 Node.js 官方提供的异步上下文共享方案 AsyncLocalStorage,该特性在 16.4.0 之前还是实验特性,16.4.0 之后已经稳定。

    AsyncLocalStorage 可以在异步操作链中共享数据。

    AsyncLocalStorage 实例 asyncLocalStorage 有以下几个主要方法:

    示例:

    const store = { id: 1 };
    // Replaces previous store with the given store object
    asyncLocalStorage.enterWith(store);
    asyncLocalStorage.getStore(); // Returns the store object
    someAsyncOperation(() => {
      asyncLocalStorage.getStore(); // Returns the same object
    });

    asyncLocalStorage.run() 函数第一个参数是存储我们在异步调用中所需要访问的共享数据,第二个参数是一个异步函数。

    下面通过一个例子来演示如何使用 AsyncLocalStorage 来实现异步资源上下文共享:

    1.png

    输出:

    runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 this is a log message
    runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 this is a log message

    通过 asyncLocalStorage.run 运行的同一个异步函数中,会运行函数 runA 和函数 runB,runA 和 runB 可以访问到相同的上下文数据。

    性能问题

    AsyncLocalStorage 为我们在 Node.js 中轻松实现异步资源上下文共享提供了很大遍历,但是每次异步资源操作都会触发 Async Hooks,势必会对我们的 Node 应用性能造成一定影响。那么影响到底有多大呢?

    根据 Kuzzle 的一个实测,使用 AsyncLocalStorage 大概会造成 8% 的额外性能损耗,当然不同的业务场景可能会有不同的性能表现。如果大家关注这部分性能表现,也可以在自己的业务中增加对比测试,测试具体性能影响。

    ----Log with AsyncLocalStorageLog classicdifference
    req/s26132842〜8%

    应用场景

    在其他多线程语言中,每个 HTTP 创建一个新的线程,每个线程拥有自己的内存。你可以在在线程内存中存储全局状态,并在代码的任何位置获取到全局状态。

    在 Node.js 中,因为 Node.js 是单线程的,会在所有 HTTP 请求中共享内存,所以每个 HTTP 请求无法做到持有相互隔离的全局状态。

    AsyncLocalStorage 可以有效隔离不同异步操作之间的状态,在 HTTP 请求追踪、APM 工具、上下文日志追踪、基于请求的全链路日志追踪等场景有非常重要的作用。

    更多node相关知识,请访问:nodejs 教程

    以上就是什么是异步资源?浅析Node实现异步资源上下文共享的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:nodejs​ node Node.js
    上一篇:四种方法搞定JavaScript创建多个对象 下一篇:浅析IDEA中如何开发Angular
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 什么是流(Stream)?如何理解Nodejs中的流• 浅析Node.js中的Buffer,聊聊事件循环• 浅析nodejs项目中的package.json的常见配置属性• 深入了解Node的模块机制,聊聊模块实现流程• 详解node中如何安装多版本并进行切换• 【吐血总结】10个值得使用的热门Nodejs框架
    1/1

    PHP中文网