Node.js 服务性能翻倍的秘密(一)

本文探讨了Node.js服务性能提升的关键,特别是通过分析fastify框架如何通过优化JSON序列化方法实现性能翻倍。文章揭示了fastify内部自定义的JSON序列化策略,与标准JSON.stringify方法相比,其简化了序列化过程,提高了效率。同时提到了fastify的其他性能优化手段,如使用parser库和上下文对象的复用。
摘要由CSDN通过智能技术生成

前言

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JalnOzRs-1611196695413)(https://file.shenfq.com/pic/20201213162826.png)]

性能提升的关键

我们先看看 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 对请求的响应体定义了一个 schemafastify 除了可以定义响应体的 schema,还支持对如下数据定义 schema

  1. body:当为 POST 或 PUT 方法时,校验请求主体;
  2. query:校验 url 的 查询参数;
  3. params:校验 url 参数;
  4. 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 核
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值