Fastify 于 Express 与 Koa 的对比:一切为了性能

前言

在前端开发中,使用 Node.js 构建后端 API 是很常见的。使用 Express 和 Koa 一直是主流选择。但是,这两个框架的性能已经被一些新的框架所超越了。其中一个成功的例子是 Fastify。

Fastify 是一个针对 Node.js 的高度专业化的 Web 框架,它的重点是提供最快的速度和最低的开销。本文将对 Fastify、Express 和 Koa 进行一些比较,以便更好地理解 Fastify 的优点。

为什么需要更快的框架?

现在,随着前后端分离的流行和大量的 API 请求,后端服务的性能至关重要。一些性能影响因素包括处理 JSON、路由、输入验证、数据验证等等。

如果服务性能不好,可能会导致以下这些问题:

  • 减速的响应时间
  • 大量周期性崩溃,影响 API 可用性
  • 高昂的服务器成本

因此,使用更快的框架可以提高 API 的效率,并降低资源消耗。

Fastify 特点

Fastify 是为达到最快的速度而开发的,有以下几个特点:

  • 高性能:Fastify 的核心重点是提供快速响应和最低的开销
  • 强类型路由和插件架构:Fastify 支持强制类型路由,数据验证和插件架构,这使得 API 易维护和易扩展。
  • 支持 Typescript:Fastify 支持 Typescript,这使得开发人员可以更快地写出更安全的代码并在应用程序上节省时间。
  • 内置锁:Fastify 有内置的锁定,这些锁确保只有一个进程可以在同一时刻提供相同的数据。
  • 扩展性:Fastify 的插件架构使得应用程序可以轻松扩展。
  • 生产级别的代码质量:Fastify 严格遵循 ES6 标准,对于浏览器支持不全的特性有相应地处理方式。Fastify 的代码维护质量很高,并通过大型的单元测试和集成测试进行测试。

Fastify 和 Express 对比

性能比较

Fastify 比 Express 快得多。下面是一个简单的测试,它在两个框架之间比较了一个简单的路由,这个路由返回了一个固定的字符串。下面是测试程序:

// Fastify
const fastify = require('fastify')({
    logger: true
});

fastify.get('/test1', async (request, reply) => {
    return 'Hello World!';
});

fastify.listen(3000, function (err, address) {
    if (err) {
        fastify.log.error(err)
        process.exit(1)
    }
})

// Express
const express = require('express')
const app = express()

app.get('/test1', function (req, res) {
    res.send('Hello World!')
})

app.listen(3000, () => console.log('Example app listening on port 3000!'))

我们使用 wrk 工具进行压力测试,下面是测试结果:

# Fastify
~ % wrk -t2 -c125 http://localhost:3000/test1
Running 10s test @ http://localhost:3000/test1
  2 threads and 125 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.19ms    1.86ms  46.09ms   92.17%
    Req/Sec     9.61k     1.37k   12.56k    76.50%
  192270 requests in 10.10s, 24.22MB read
Requests/sec:  19043.72
Transfer/sec:      2.40MB

# Express
~ % wrk -t2 -c125 http://localhost:3000/test1
Running 10s test @ http://localhost:3000/test1
  2 threads and 125 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    83.49ms   92.33ms   1.15s    96.43%
    Req/Sec   303.79     70.00   400.00     75.00%
  5837 requests in 10.10s, 1.29MB read
Requests/sec:    577.51 
Transfer/sec:    130.79KB

从这个测试可以看出,Fastify 比 Express 快了将近 30 倍。

路由

Fastify 的路由比 Express 更简单和更具有表现力。在 Fastify 中,你可以使用以下代码定义强类型路由:

fastify.get<{
    Params: { id: string }
}>('/user/:id', async (req, res) => {
    const user = await userService.getUser(req.params.id);
    return user;
});

这可以让编译器检查路由参数的类型。由于 Fastify 允许使用自定义的类型,因此可以更好地保证类型安全。

而在 Express 中,路由的声明就不是类型安全的了。

错误处理

Fastify 的错误处理机制非常好。Fastify 不仅支持全局错误处理程序,还可以为每个路由添加自定义错误处理。这让开发人员捕获和处理错误变得更加容易。

Express 的错误处理机制相比之下就没有那么灵活了。

Fastify 和 Koa 对比

虽然 Koa 和 Express 有相似之处,但 Koa 的设计与其前身 Express 有很大不同。Fastify 和 Koa 之间的差异有以下特点:

Faatify 支持强类型

Fastify 支持强类型路由和参数定义,这使得开发人员可以更好地验证请求输入和响应输出。

Fastify 内置数据验证

Fastify 内置数据验证。这意味着你可以在定义路由时添加验证。

fastify.get<{
    Params: { id: string }
}>('/user/:id', {
    schema: {
        response: {
            200: {
                type: 'object',
                properties: {
                    id: { type: 'number' },
                    name: { type: 'string' }
                }
            }
        }
    }
}, async (req, res) => {
    const user = await userService.getUser(req.params.id);
    return user;
});

执行流程简化

Koa 重新定义了中间件调用机制,但在实际使用中,会导致大量的回调嵌套。

Fastify 抛弃了回调函数,使用同步方式执行中间件。

fastify.get('/test1', async (request, reply) => {
    return 'Hello World!';
});

总结

Fastify 是一个高度专业化的框架,它的重点是提供最快的速度和最低的开销。Fastify 明显比其竞争对手快得多,而且很容易扩展并且拥有优秀的开发体验。

总的来说,如果你的项目对性能要求比较高,那么尝试一下 Fastify 是一个不错的选择。

参考资料

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b0f50fadd4f0e0ffa4af67