· fastify / express / nodejs

Fastify vs Express — khoảng cách hiệu năng là có thật (2026)

Fastify xử lý nhiều hơn 55% request mỗi giây so với Express 5.x. Với TypeScript API mới, lợi thế DX của Fastify còn thuyết phục hơn cả con số hiệu năng.

Bởi

2.596 từ · 13 phút đọc

Nếu bạn đang bắt đầu một Node.js API project mới, hãy chọn Fastify. Nếu bạn đang bảo trì một codebase Express lớn và điểm nghẽn là database, cứ ở lại — chi phí migration sẽ không bù được lợi ích. Đó là kết luận. Phần còn lại của bài này là bằng chứng.

Bài này dành cho ai

Những kỹ sư Node.js đang chọn framework cho một TypeScript service mới, hoặc đang cân nhắc xem migration từ Express có đáng không. Nếu bạn đang dùng Express 4.x và băn khoăn giữa việc nâng lên 5.x hay chuyển sang Fastify, bài so sánh này là cho bạn.

Nếu app của bạn đã dùng Fastify rồi, bạn có thể bỏ qua thẳng phần so sánh DX — bạn có thể tìm được lý lẽ để thuyết phục đồng đội đang muốn quay lại Express.

Những gì chúng tôi đã kiểm thử

Chúng tôi trích dẫn benchmark từ nguồn gốc là repository fastify/benchmarks chính thức (github.com/fastify/benchmarks), cập nhật lần cuối ngày 18 tháng 5 năm 2026. Môi trường kiểm thử: Node.js v24.15.0, Linux x64, 4 vCPU, 15.6 GB RAM. Phương pháp: autocannon -c 100 -d 40 -p 10 localhost:3000 (một vòng khởi động, một vòng đo chính thức).

Phiên bản được kiểm thử: Fastify 5.8.5 so với Express 5.2.1.

Với các con số mô phỏng workload thực tế, chúng tôi tham chiếu benchmark từ bên thứ ba của Michael Guay (michaelguay.dev, tháng 10 năm 2025) — bổ sung authentication, request validation và database inserts vào workload. Phương pháp được ghi chú tại nơi trích dẫn.

Kết quả benchmark: Fastify vs Express

Con số đáng chú ý nhất: Fastify xử lý nhiều hơn 55% số request mỗi giây so với Express 5.x, với latency thấp hơn 37%, trên một endpoint hello-world đơn giản.

FrameworkPhiên bảnReq/sLatency (trung bình)Throughput
Node (bare HTTP)v24.15.058,10816.71 ms10.36 MB/s
Fastify5.8.555,71617.43 ms9.99 MB/s
Express5.2.135,90927.37 ms6.40 MB/s

Nguồn: github.com/fastify/benchmarks, ngày 18 tháng 5 năm 2026, Node.js v24.15.0.

Fastify chạy ở 96% throughput của bare Node. Express chỉ đạt 62%. Khoảng cách ~34 điểm phần trăm đó là overhead của framework mà bạn đang trả cho mỗi request.

Trang benchmark chính thức của Fastify hiển thị gì (và tại sao con số lại khác)

Trang fastify.dev/benchmarks hiển thị khoảng cách ~5× với Express chỉ đạt 9,433 req/s. Con số đó có thật, nhưng nó phản ánh Express 4.x, không phải 5.x. Express 5.x trở thành latest vào tháng 3 năm 2025 và nhanh hơn đáng kể so với phiên bản cũ. Đừng trích dẫn con số 5× khi đang so với một setup Express hiện đại.

So sánh đúng là 55,716 so với 35,909 — chênh lệch 1.55×, không phải 5×.

Workload thực tế: khoảng cách vẫn có ý nghĩa

Benchmark hello-world thuần túy chỉ đo overhead của framework. Chuyện gì xảy ra khi thêm auth, validation và database writes?

Michael Guay đã chạy một POST endpoint có authentication, request validation (JSON Schema trên Fastify, thủ công trên Express) và database inserts trên cả hai framework:

FrameworkReq/sAvg latency
Express1,84753.2 ms
Fastify4,23123.1 ms

Nguồn: michaelguay.dev, tháng 10 năm 2025. Một nguồn duy nhất; coi là đúng về chiều hướng, không phải con số tuyệt đối. Phương pháp: autocannon, cùng số lượng connection.

Fastify nhanh gấp 2.3× dưới workload thực tế. Chậm hơn con số 5× trong truyền thuyết, nhưng nhanh hơn nhiều so với kỳ vọng của phần lớn mọi người. Hai yếu tố tạo ra khoảng cách trong production:

  1. Schema compilation: Fastify biên dịch JSON Schema validation một lần khi khởi động, theo từng route. Express với validation thủ công (zod, joi, express-validator) phân tích và validate lại trên mỗi request.
  2. Serialization: Fastify dùng fast-json-stringify — serialization dựa trên schema giúp tránh đường dẫn JSON.stringify thông thường. Chi phí response serialization gần như bằng không trong Fastify; trong Express thì không nhỏ.

Hệ quả thực tế: throughput gấp đôi với cùng chi phí đồng nghĩa với việc bạn có thể xử lý gấp đôi lưu lượng truy cập trước khi cần thêm server instance. Ở quy mô indie hoặc startup, đó là tiền thật. Nếu điểm nghẽn là database (và ở giai đoạn đầu thường là vậy), khoảng cách này không nhìn thấy được — cả hai framework đều mất 40 ms chờ Postgres trong khi chỉ tự thêm tối đa 2 ms. Hãy tối ưu câu query trước.

So sánh DX

TypeScript

Fastify có hỗ trợ TypeScript first-party do core team bảo trì từ v2. Kiến trúc dựa trên generics (FastifyRequest<{Body: MyType}>) truyền types xuyên suốt route handler. Kết hợp với @fastify/type-provider-typebox, bạn có kiểm tra type tại compile time và JSON Schema validation tại runtime từ một nguồn duy nhất — viết schema một lần, có validation và types miễn phí.

Express 5.2.1 vẫn phụ thuộc vào @types/express v5.0.6 — type definitions do cộng đồng bảo trì, không được bundle sẵn. Express team thừa nhận việc cải thiện TypeScript DX là công việc đang lên kế hoạch trong bài đăng phát hành v5.1.0. Hoạt động được, nhưng bạn sẽ phải viết nhiều code gắn kết hơn để có typed route handlers.

Nếu bạn đang bắt đầu một TypeScript project, đây có thể là lý do thuyết phục hơn để dùng Fastify so với con số benchmark thuần túy. Bạn không còn phải bảo trì hai biểu diễn của cùng một data shape nữa. Khi đã chọn xong framework, quyết định tiếp theo thường là layer dữ liệu — xem ORM tốt nhất cho TypeScript nếu bạn chưa chọn ORM.

Schema validation

Fastify được thiết kế theo hướng schema-first. Bạn khai báo JSON Schema (hoặc TypeBox tương đương) cho mỗi route. Fastify từ chối input không hợp lệ trước khi handler chạy — không cần tự nối dây validation, không lo quên validation ở một route nào đó. Request không hợp lệ tự động trả về error format nhất quán.

Express cho bạn một tờ giấy trắng. Validation là thủ công: cài zod hoặc joi, gọi .parse() ở đầu mỗi handler, tự xử lý error được throw ra. Không khó, nhưng đây là công việc lặp lại cho mỗi route, và một route bạn quên nối dây sẽ thất bại trong im lặng.

Plugin system vs middleware chain

Express dùng imperative middleware chain kiểu Connect — app.use(middleware). Mọi senior Express developer đều biết pattern này. Đây cũng là nguồn gốc của mọi buổi debug “middleware chạy hai lần”.

Fastify dùng scoped plugin system. Các plugin được đăng ký với fastify.register() và có scope riêng biệt trừ khi bạn muốn expose ra parent. Đường cong học tập dốc hơn, nhưng đáng công khi bạn cần modular API: plugin đóng gói configuration, decorators và lifecycle hooks mà không làm ô nhiễm global app instance.

Nếu team bạn mới với Node.js, mental model của Express dễ bắt đầu hơn. Nếu bạn đang xây dựng một modular API sẽ tiếp tục phát triển, scoping của Fastify ngăn chặn anti-pattern phổ biến trong Express là middleware lan sang các route group khác.

Logging

Fastify tích hợp sẵn Pino. Pino là structured JSON logging với overhead thấp nhất trong số các Node.js logger. Log levels, serializers, redaction — tất cả được cấu hình qua tùy chọn logger của Fastify khi khởi động.

Express không có logging tích hợp sẵn. Morgan là lựa chọn mặc định trên thực tế và nó không phải structured — bạn chỉ nhận được Apache Combined Log Format, không phải JSON. Nếu muốn structured logs trong Express, bạn phải tự nối Pino và mất đi lớp tích hợp của Fastify.

OpenAPI tích hợp sẵn

@fastify/swagger + @fastify/swagger-ui sinh ra tài liệu OpenAPI từ chính JSON Schema bạn viết cho validation. Viết schema, có docs. Không cần code-gen, không có spec file riêng, không bao giờ lệch giữa code và docs.

Express yêu cầu tooling OpenAPI riêng (swagger-jsdoc, tsoa, v.v.) tạo thêm một lớp tài liệu mà bạn phải đồng bộ thủ công.

Hệ sinh thái và mức độ phổ biến

Express được download nhiều hơn Fastify 13×: ~101M lượt download npm hàng tuần so với ~7.5M. Khoảng cách này có thật và quan trọng.

Điều đó có nghĩa gì trong thực tế:

  • Nhiều câu trả lời StackOverflow, tutorial và kiến thức sẵn có trong team hơn
  • Nhiều package npm hơn đi kèm Express-native middleware
  • Tự tin hơn rằng use case kỳ lạ của bạn đã có người giải quyết

Yếu tố làm phình con số: Express downloads bao gồm transitive dependencies — mọi package phụ thuộc vào hoặc tích hợp tùy chọn với Express đều kéo nó về khi npm install. Con số download của Fastify sạch hơn (ít package hơn coi Fastify là optional peer).

Tốc độ tăng trưởng của Fastify dốc hơn. Nó có 36,265 GitHub stars và 292 plugin được liệt kê chính thức — 61 core package @fastify/* và 231 community plugin. Các core plugin bao phủ toàn bộ backend surface: JWT, OAuth2, CSRF, WebSocket, PostgreSQL, MongoDB, Redis, multipart uploads, rate limiting, CORS và nhiều hơn nữa. Fastify là OpenJS Foundation At Large project. Express là OpenJS Impact project — tier cao nhất — được thừa nhận từ install base của nó. Cả hai đều có hậu thuẫn từ tổ chức; không cái nào có nguy cơ bị bỏ rơi.

Express 5.x nhắm tới MAINTENANCE LTS sớm nhất là tháng 4 năm 2026 và EOL sớm nhất là tháng 4 năm 2027, theo bài đăng phát hành v5.1.0. Project không bị bỏ rơi, nhưng nhịp độ đổi mới chậm. Không có TypeScript tích hợp, không có validation tích hợp, không có structured logging — những quyết định thiết kế được đưa ra một thập kỷ trước và chưa được xem xét lại.

Nơi hệ sinh thái Fastify vẫn còn thiếu: các category middleware rất ngách mà ai đó đã ship express-[thing] nhưng chưa bao giờ làm tương đương cho Fastify. Nếu bạn rơi vào tình huống đó, @fastify/express (bên dưới) hoặc tự port là con đường của bạn. Hãy kiểm tra fastify.dev/ecosystem trước. Nếu bạn muốn một lựa chọn nhẹ hơn với DX gần Express hơn, hãy xem Hono vs Express.

Con đường migration

Bạn không cần làm mọi thứ cùng một lúc. @fastify/express chạy Express middleware bên trong Fastify app, cho phép bạn migrate từng route một.

npm install @fastify/express
import Fastify from 'fastify'
import ExpressPlugin from '@fastify/express'

const fastify = Fastify()
await fastify.register(ExpressPlugin)

// Chạy Express middleware hiện có trong giai đoạn chuyển đổi
fastify.use(yourExpressMiddleware)

// Route mới viết theo Fastify thuần
fastify.get('/new-route', { schema: { ... } }, async (req, reply) => {
  return { ok: true }
})

Con đường incremental này hoạt động được. Những thay đổi tư duy sẽ làm team bạn chậm lại:

  • Middleware → plugins: không phải swap một dòng. Hãy nghĩ về encapsulation scope.
  • Imperative validation → JSON Schema first: thay đổi tư duy khó nhất cho team quen gọi zod trực tiếp trong handler.
  • req.app → Fastify decorators: bất cứ thứ gì bạn lưu trên Express app object cần được chuyển thành Fastify decorator.

Tài liệu chính thức: fastify.dev/docs/latest/Guides/Migration-Guide-V5. BetterStack có hướng dẫn từng bước thực tế: betterstack.com/community/guides/scaling-nodejs/migrating-from-express-to-fastify.

Ước tính công sức thực tế: một Express app cỡ trung (20–40 routes, middleware stack tiêu chuẩn) mất một đến hai sprint để migrate đúng cách — chủ yếu là viết schema và quyết định kiến trúc plugin, không phải dịch từng dòng.

Kết luận

Chọn Fastify nếu:

  • Bạn đang bắt đầu một TypeScript API project mới. Lợi thế DX từ first-party types + TypeBox tích lũy từ ngày đầu tiên.
  • Bạn muốn tài liệu OpenAPI tích hợp mà không cần spec file riêng.
  • Bạn đang xây dựng service nhạy cảm về hiệu năng: một public-facing API, một high-throughput microservice, hay một multi-tenant backend nơi mỗi latency percentile đều quan trọng.
  • Team bạn có thể cam kết với schema-first validation. Nếu làm được, bạn không còn phải viết cùng validation wiring cho mỗi route nữa.
  • Bạn đang dùng Node.js 20+. Fastify 5.x yêu cầu điều này.

Ở lại Express nếu:

  • Bạn có một codebase lớn hiện có. Viết lại validation schema cho 200 routes không bù được lợi ích hiệu năng nếu p99 của bạn bị chi phối bởi database call.
  • Team bạn nhiều junior hoặc framework cần mới toanh học được trong một tuần. Imperative model của Express khó sử dụng sai trầm trọng và dễ Google hơn.
  • Bạn phụ thuộc vào Express-only middleware không có tương đương Fastify và không có bandwidth để tự port.
  • Điểm nghẽn rõ ràng không phải là framework overhead. Hãy profile trước. Nếu trace chậm nhất của bạn là database query, đổi framework là đòn bẩy sai.

Benchmark trong bối cảnh: cải thiện throughput 2× ở workload thực tế có ý nghĩa ở mọi quy mô — đó là sự khác biệt giữa một instance $200/tháng và một cặp instance $400/tháng dưới cùng tải. Nhưng nó không phải phép màu. Nếu app của bạn mất 80 ms mỗi request trong Postgres, Fastify tiết kiệm cho bạn 4 ms overhead serialization trong khi user vẫn phải chờ 76 ms. Hãy sửa câu query.

Lợi thế TypeScript DX và kiến trúc schema-first thực ra là lý do thuyết phục hơn để chuyển sang Fastify so với các con số thuần túy — đặc biệt với các team liên tục phải viết lại cùng một validation wiring cho mỗi project mới.

Lưu ý

  • Kết quả benchmark chạy trên phần cứng ảo. Con số có thể dao động 10–20% tùy cloud provider, loại host instance và cài đặt concurrency. Hãy dùng những số này như dữ liệu định hướng, không phải cam kết.
  • Con số 2.3× trong thực tế đến từ một benchmark bên thứ ba duy nhất (Michael Guay, tháng 10 năm 2025). Phương pháp hợp lý nhưng chưa được nhân rộng độc lập.
  • Hệ sinh thái plugin của Fastify, dù đang phát triển, vẫn có khoảng trống ở các lĩnh vực ngách. Kiểm tra fastify.dev/ecosystem cho use case cụ thể của bạn trước khi quyết định.
  • Nếu bạn deploy trên Bun, khoảng cách Fastify vs Express có thể rộng hơn — Fastify chạy được trên Bun, và I/O nhanh hơn của Bun có thể khuếch đại lợi thế serialization của Fastify. Chúng tôi không benchmark tổ hợp này. Xem Bun vs Node.js để tham khảo hiệu năng runtime của Bun.
  • Không có affiliate link trong bài này. Tất cả link đều dẫn đến tài liệu chính thức hoặc nguồn gốc.

Tài liệu tham khảo

NguồnURL
fastify/benchmarks (nguồn gốc, hiện tại)github.com/fastify/benchmarks
Trang benchmark fastify.devfastify.dev/benchmarks
Tài liệu TypeScript của Fastifyfastify.dev/docs/latest/Reference/TypeScript
Bài đăng phát hành Express v5.1.0expressjs.com/en/blog/2025-03-31-v5-1-latest-release.html
Hệ sinh thái / plugin Fastifyfastify.dev/ecosystem
OpenJS Foundation — danh sách projectopenjsf.org/projects
BetterStack — migration Express → Fastifybetterstack.com/community/guides/scaling-nodejs/migrating-from-express-to-fastify
Benchmark thực tế (Michael Guay)michaelguay.dev/express-vs-fastify-a-performance-benchmark-comparison
Fastify Migration Guide V5fastify.dev/docs/latest/Guides/Migration-Guide-V5