我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node.js服务性能翻倍秘密是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node.js服务性能翻倍秘密是什么

本篇内容主要讲解“Node.js服务性能翻倍秘密是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js服务性能翻倍秘密是什么”吧!

前言

用过 Node.js 开发过的同学肯定都上手过 koa,因为他简单优雅的写法,再加上丰富的社区生态,而且现存的许多 Node.js 框架都是基于 koa  进行二次封装的。但是说到性能,就不得不提到一个知名框架:fastify ,听名字就知道它的特性就是快,官方给出的Benchmarks甚至比 Node.js  原生的 http.Server 还要快。

Node.js服务性能翻倍秘密是什么

Benchmarks

性能提升的关键

我们先看看 fastify 是如何启动一个服务的。

# 安装 fastify npm i -S fastify@3.9.1
// 创建服务实例 const fastify = require('fastify')()  app.get('/', {   schema: {     response: {       // key 为响应状态码       '200': {         type: 'object',         properties: {           hello: { type: 'string' }         }       }     }   } }, async () => {   return { hello: 'world' } })  // 启动服务 ;(async () => {   try {     const port = 3001 // 监听端口     await app.listen(port)     console.info(`server listening on ${port}`)   } catch (err) {     console.error(err)     process.exit(1)   } })()

从上面代码可以看出,fastify 对请求的响应体定义了一个 schema,fastify 除了可以定义响应体的 schema,还支持对如下数据定义  schema:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. body:当为 POST 或 PUT 方法时,校验请求主体;

  3. query:校验 url 的 查询参数;

  4. params:校验 url 参数;

  5. response:过滤并生成用于响应体的 schema。

app.post('/user/:id', {   schema: {     params: {       type: 'object',       properties: {        id: { type: 'number' }       }     },     response: {       // 2xx 表示 200~299 的状态都适用此 schema       '2xx': {         type: 'object',         properties: {           id: { type: 'number' },           name: { type: 'string' }         }       }     }   } }, async (req) => {   const id = req.params.id   const userInfo = await User.findById(id)   // Content-Type 默认为 application/json   return userInfo })

让 fastify 性能提升的的秘诀在于,其返回 application/json 类型数据的时候,并没有使用原生的  JSON.stringify,而是自己内部重新实现了一套 JSON 序列化的方法,这个 schema 就是 JSON 序列化性能翻倍的关键。

如何对 JSON 序列化

在探索 fastify 如何对 JSON 数据序列化之前,我们先看看 JSON.stringify 需要经过多么繁琐的步骤,这里我们参考 Douglas  Crockford (JSON 格式的创建者)开源的 JSON-js 中实现的 stringify 方法。

“JSON-js:https://github.com/douglascrockford/JSON-js/blob/master/json2.js

// 只展示 JSON.stringify 核心代码,其他代码有所省略 if (typeof JSON !== "object") {   JSON = {}; } JSON.stringify = function (value) {   return str("", {"": value}) } function str(key, holder) {   var value = holder[key];   switch(typeof value) {     case "string":       return quote(value);     case "number":       return (isFinite(value)) ? String(value) : "null";     case "boolean":     case "null":       return String(value);     case "object":       if (!value) {         return "null";       }       partial = [];       if (Object.prototype.toString.apply(value) === "[object Array]") {         // 处理数组         length = value.length;         for (i = 0; i < length; i += 1) {           // 每个元素都需要单独处理           partial[i] = str(i, value) || "null";         }         // 将 partial 转成 ”[...]“         v = partial.length === 0           ? "[]"           : "[" + partial.join(",") + "]";         return v;       } else {         // 处理对象         for (k in value) {           if (Object.prototype.hasOwnProperty.call(value, k)) {             v = str(k, value);             if (v) {               partial.push(quote(k) + ":" + v);             }           }         }         // 将 partial 转成 "{...}"         v = partial.length === 0           ? "{}"          : "{" + partial.join(",") + "}";         return v;       }   } }

从上面的代码可以看出,进行 JSON 对象序列化时,需要遍历所有的数组与对象,逐一进行类型的判断,并对所有的 key 加上  "",而且这里还不包括一些特殊字符的 encode 操作。但是,如果有了 schema 之后,这些情况会变得简单很多。fastify 官方将 JSON  的序列化单独成了一个仓库:fast-json-stringify,后期还引入了 ajv  来进行校验,这里为了更容易看懂代码,选择看比较早期的版本:0.1.0,逻辑比较简单,便于理解。

“fast-json-stringify@0.1.0:https://github.com/fastify/fast-json-stringify/blob/v0.1.0/index.js

function $Null (i) {   return 'null' }  function $Number (i) {   var num = Number(i)   if (isNaN(num)) {     return 'null'   } else {     return String(num)   } }  function $String (i) {   return '"' + i + '"' }  function buildObject (schema, code, name) {   // 序列化对象 ... }  function buildArray (schema, code, name) {   // 序列化数组 ... }  function build (schema) {   var code = `     'use strict'      ${$String.toString()}     ${$Number.toString()}     ${$Null.toString()}   `   var main    code = buildObject(schema, code, '$main')    code += `     ;     return $main   `    return (new Function(code))() }  module.exports = build

fast-json-stringify 对外暴露一个 build 方法,该方法接受一个 schema,返回一个函数($main),用于将 schema  对应的对象进行序列化,具体使用方式如下:

const build = require('fast-json-stringify')  const stringify = build({   type: 'object',   properties: {     id: { type: 'number' },     name: { type: 'string' }   } }) console.log(stringify)  const objString = stringify({   id: 1, name: 'shenfq' }) console.log(objString) // {"id":1,"name":"shenfq"}

经过 build 构造后,返回的序列化方法如下:

function $String (i) {   return '"' + i + '"' } function $Number (i) {   var num = Number(i)   if (isNaN(num)) {     return 'null'   } else {     return String(num)   } } function $Null (i) {   return 'null' } // 序列化方法 function $main (obj) {   var json = '{'    json += '"id":'    json += $Number(obj.id)   json += ','   json += '"name":'    json += $String(obj.name)    json += '}'   return json }

可以看到,有 schema 做支撑,序列化的逻辑瞬间变得无比简单,最后得到的 JSON 字符串只保留需要的属性,简洁高效。我们回过头再看看  buildObject 是如何生成 $main 内的代码的:

function buildObject (schema, code, name) {   // 构造一个函数   code += `     function ${name} (obj) {       var json = '{'   `   var laterCode = ''   // 遍历 schema 的属性   const { properties } = schema   Object.keys(properties).forEach((key, i, a) => {     // key 需要加上双引号     code += `       json += '${$String(key)}:'     `     // 通过 nested 转化 value     const value = properties[key]     const result = nested(laterCode, name, `.${key}`, value)      code += result.code     laterCode = result.laterCode      if (i < a.length - 1) {       code += 'json += \',\''     }   })    code += `       json += '}'       return json     }   `    code += laterCode    return code }  function nested (laterCode, name, key, schema) {   var code = ''   var funcName   // 判断 value 的类型,不同类型进行不同的处理   const type = schema.type   switch (type) {     case 'null':       code += `       json += $Null()       `       break     case 'string':       code += `       json += $String(obj${key})       `       break     case 'number':     case 'integer':       code += `       json += $Number(obj${key})       `       break     case 'object':       // 如果 value 为一个对象,需要一个新的方法进行构造       funcName = (name + key).replace(/[-.\[\]]/g, '')       laterCode = buildObject(schema, laterCode, funcName)       code += `         json += ${funcName}(obj${key})       `       break     case 'array':       funcName = (name + key).replace(/[-.\[\]]/g, '')       laterCode = buildArray(schema, laterCode, funcName)       code += `         json += ${funcName}(obj${key})       `       break     default:       throw new Error(`${type} unsupported`)   }    return {     code,     laterCode   } }

其实就是对 type 为 "object" 的 properties 进行一次遍历,然后针对 value  不同的类型进行二次处理,如果碰到新的对象,会构造一个新的函数进行处理。

// 如果包含子对象 const stringify = build({   type: 'object',   properties: {     id: { type: 'number' },     info: {       type: 'object',       properties: {         age: { type: 'number' },         name: { type: 'string' },       }     }   } })  console.log(stringify.toString())
function $main (obj) {   var json = '{'    json += '"id":'    json += $Number(obj.id)   json += ','   json += '"info":'    json += $maininfo(obj.info)    json += '}'   return json }  // 子对象会通过另一个函数处理 function $maininfo (obj) {   var json = '{'    json += '"age":'    json += $Number(obj.age)   json += ','   json += '"name":'    json += $String(obj.name)    json += '}'   return json }

到此,相信大家对“Node.js服务性能翻倍秘密是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node.js服务性能翻倍秘密是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js事件循环的秘密武器:揭开高性能服务器的底层秘密

剖析Node.js事件循环的工作原理,洞悉I/O密集型任务处理的核心,掌握高效应用Node.js的秘诀。 事件循环、非阻塞、I/O、回调、异步、Promise、Generator Node.js事件循环的魅力:I/O密集型任务处理的利器
Node.js事件循环的秘密武器:揭开高性能服务器的底层秘密
2024-02-03

云服务器的性能参数是什么

云服务器的性能参数包括但不限于以下几个方面:处理器:云服务器通常使用多核CPU,以支持更快的处理能力。这意味着云服务器可以处理大量数据并减少延迟。内存:云服务器通常使用大内存,以便在长时间运行时保持大量的数据。这会减少数据的读取和写入,同时也可以提高应用程序的可伸缩性。磁盘空间:云服务器通常使用大容量的磁盘存储数据,以便在需要时可以存储大量的数据。这有助于减少磁盘空间的使用,并提供更好的数据保护。多路径负载...
2023-10-27

云服务器的性能特点是什么

云服务器(CloudStorage)是一种使用虚拟化技术构建的服务器,它通过网络连接到多个位置,为用户提供高性能、弹性和可扩展的云服务。具体而言,云服务器的性能特点包括以下几点:高性能:云服务器可以提供比传统服务器更高的CPU、内存、I/O等物理资源,以满足用户对高性能应用的需求。弹性扩展:云服务器可以根据负载情况动态伸缩,无需关闭云服务器本地服务,使得用户可以随时获取所需的服务水平。可靠性:云服务器采用服务器虚拟化技术...
2023-10-27

阿里云服务器功能,性能,价值是什么

高可靠性:阿里云服务器具有高可靠性,能够承载大流量负载,保证服务的稳定性和可靠性。高性能:阿里云服务器采用多节点同步技术,可以提供高速的网络连接,支持高并发请求。高可用性:阿里云服务器采用冗余架构设计,可以支持100%的故障率,保证系统的可用性和可靠性。高扩展性:阿里云服务器提供丰富的扩展接口,可以轻松扩展存储、计算、网络等功能,满足业务快速发展的需求。高安全性:阿里云服务器采用多重加密和访问控制机制...
2023-10-27

云服务器运算性能指标是什么

云服务器(CloudServer)是一种用于存储、处理和管理大量数据的云计算平台,其拥有高性能的计算能力和极快的响应速度。下面是一个关于云服务器运算性能指标的简单介绍:处理峰值负载:云服务器通常具有处理峰值负载的能力,可以将大量的数据在服务器上快速处理并存储到云上,以便能够快速提供所需的数据和服务。处理实时数据:云服务器可以快速响应实时数据流,并将其存储在服务器上以保持数据的可靠性。快速响应业务变化:对于那些需要快速...
2023-10-27

亚马逊服务器性能指标是什么

亚马逊服务器性能指标是衡量亚马逊云服务(AWS)服务器性能的一组指标。这些指标包括CPU使用率、内存使用率、磁盘读写速度、网络流量等。这些指标可以帮助用户了解服务器的运行状况,以及是否需要进行优化或扩容。以下是一些常见的亚马逊服务器性能指标:CPU使用率:衡量CPU的使用率,以百分比表示。高CPU使用率可能意味着服务器正在处理大量请求或运行复杂的应用程序。内存使用率:衡量服务器内存的使用率,以百分...
2023-10-27

云服务器的主要性能参数是什么

云服务器的主要性能参数如下:可用性:云服务器可以承载多种应用程序或服务,包括Web应用程序和数据库应用程序,并提供高可用性,以确保在出现故障时可以快速恢复。可用性是云服务器的核心性能指标。IaaS(InfrastructureasaService,基础设施即服务):云服务器支持多种硬件类型,如服务器、存储器、网络设备等,从而可以支持各种应用程序和服务。IaaS可以提供更高的灵活性和伸缩性,
2023-10-26

弹性云服务器服务提供的主要功能是什么

弹性云服务器(ElasticCloudStorage,ECS)是一种云服务器技术,它通过动态调度资源来为用户提供高度可伸缩性、可用性和快速扩展的解决方案。弹性云服务器服务提供的主要功能包括:高可用性:提供多台云服务器的并发访问能力,可以保证用户的高可用性。当用户请求的负载超出某个阈值时,弹性云服务器会自动将其调度到其他云服务器上。伸缩性:弹性云服务器可以根据业务流量的变化,自动将其调整为
2023-10-26

亚马逊云服务器的性能模式是什么

MaxCompute:最大计算和存储资源,以实现高性能和可扩展性。MaxAvailability:可根据负载平衡自动调整计算和存储资源,以满足高峰期的需求。MiniMax:更小的计算和存储资源,以实现更高的灵活性和可扩展性。SmartOps:使用自动化技术来优化服务器配置和资源管理,以提高效率和可靠性。MaxCompute+:将MaxCompute和MiniMax结合起来,提供更全面的计算和存储支持,以满足各种场景的需求。不同的性能模式适用于不同的场...
2023-10-27

亚马逊服务器性能测试方法是什么

压力测试:模拟高负载的情况下,亚马逊服务器能够承受的压力。测试方法可以通过限制服务器的访问时间、监测服务器的CPU和内存使用情况、设置定时器等方式来模拟高负载情况。响应时间测试:模拟服务器响应客户端请求的速度,以此评估服务器的性能和稳定性。测试方法可以通过监测服务器的响应时间、处理并发请求的能力、调整服务器配置等方式来评估服务器的响应时间。负载测试:模拟高并发量情况下,亚马逊服务器能够承受的负载量...
2023-10-27

云服务器运算性能测试方法是什么

负载测试:模拟多用户同时访问云服务器的情况,记录每个用户的请求数量和延迟时间等指标,以评估云服务器的承载能力和响应速度。性能测试:测试云服务器在单个请求下的处理能力,包括读、写、缓存等方面的性能表现,比如读取大文件、写入小文件等。资源利用率测试:测试云服务器在某个资源(如CPU、内存等)不足的情况下的性能表现,比如读取大量数据或执行长时间运行的任务时的资源占用情况。并发测试:测试云服务器在多个并发用...
2023-10-27

常用的监控服务器性能命令是什么

这篇文章主要讲解了“常用的监控服务器性能命令是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常用的监控服务器性能命令是什么”吧!一、top -实时监控命令1、能够实时监控系统的运行状态,
2023-06-03

亚马逊服务器性能测试标准是什么

负载均衡测试:测试服务器能够承受多少并发请求,并保证不会因为服务器性能瓶颈而导致用户访问缓慢或无法响应。高可用性测试:测试服务器能够在多长时间内无故障运行,并且不会因为单点故障导致整个服务不可用。资源利用率测试:测试服务器资源的利用率,包括硬件资源、内存和带宽等,以评估服务器的效率和可靠性。性能监控测试:测试服务器的性能表现,包括CPU使用率、内存占用、磁盘使用率、网络带宽等,以帮助管理员了解服务...
2023-10-27

云服务器运算性能检测方法是什么

CPU测试:可以使用SuperPi、Prime95、Cinebench等工具来模拟真实用户的操作,测试云服务器的处理能力。内存测试:可以使用SuperPi和GoldWrk等内存测试工具来测试云服务器的内存使用情况,比较不同进程之间的内存占用情况,找出内存瓶颈。多线程测试:可以使用TwilioThreadingCLI和PyTorchCore来模拟多线程操作,测试云服务器的并发性能。分布式测试:可以使用HadoopFive-Team和SparkStreamingFoundation来...
2023-10-27

服务器性能监测工具主要是测什么

服务器性能监测工具主要测量以下内容:1. CPU使用率:监测服务器CPU的负载情况,包括CPU的使用率、空闲率、等待率等。2. 内存使用情况:监测服务器内存的使用情况,包括内存的使用率、空闲率、缓存和缓冲区的使用情况等。3. 磁盘使用情况:
2023-06-05

揭开服务器操作系统标准化的秘密:它能为我做什么?

服务器操作系统标准化可以带来许多好处,包括提高安全性、降低成本、简化管理等。这篇将探讨服务器操作系统标准化的含义,以及它能为企业带来哪些好处。
揭开服务器操作系统标准化的秘密:它能为我做什么?
2024-02-21

服务器的主要性能和外观特点是什么

服务器的主要性能和外观特点是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。服务器的特殊用途以及它的应用环境决定了它与PC间的配置有所不同。对于初级人员而言,
2023-06-07

云服务器的主要性能参数是什么意思

云服务器的主要性能参数是指在计算机或服务器中用于评估其性能的指标,这些指标包括I/O性能、内存、网络带宽、存储等方面。下面列出一些常见的主要性能参数:I/O性能:指计算机或服务器内部的读写操作数量。I/O性能可以通过使用缓冲区来提高性能。内存:通常用来存储数据。内存大小可以通过更大的内存槽来提高性能。网络带宽:指计算机或服务器之间传输数据所用的带宽。如果网络带宽不足,计算机或服务器之间的
2023-10-26

编程热搜

目录