Hono.js trên Cloudflare Workers: Đánh giá sau 6 tháng triển khai thực tế

Programming tutorial - IT technology blog
Programming tutorial - IT technology blog

Tại sao tôi chuyển Stack của mình lên Edge

Tôi đã dành gần một thập kỷ để xây dựng các API với Node.js và Express. Đó từng là tiêu chuẩn của ngành và hoạt động ổn định trong nhiều năm. Nhưng khi cơ sở người dùng của tôi trở nên toàn cầu hơn, những hạn chế của máy chủ tập trung trở nên không thể ngó lơ. Độ trễ (Latency) là kẻ sát nhân thầm lặng đối với tỷ lệ chuyển đổi. Khi một người dùng ở Singapore truy cập vào máy chủ tại US-East-1, họ sẽ gặp phải độ trễ từ 200ms đến 300ms trước khi byte đầu tiên được truyền đi. Sự chậm trễ đó là có thể cảm nhận được rõ rệt.

Sáu tháng trước, tôi đã di chuyển ba microservices có lưu lượng truy cập cao sang Cloudflare Workers bằng cách sử dụng Hono.js. Đây không chỉ đơn thuần là thay đổi framework; đó là một sự tư duy lại hoàn toàn về hạ tầng của chúng tôi. Thay vì nằm chờ ở một trung tâm dữ liệu duy nhất, API của tôi giờ đây sống trên mạng lưới toàn cầu của Cloudflare. Nó thực thi tại “edge” (vùng biên), chỉ cách người dùng cuối vài dặm. Sau nửa năm vận hành thực tế, kết quả đã rõ ràng: thời gian phản hồi đã giảm mạnh và chi phí vận hành hạ tầng của chúng tôi gần như biến mất.

So sánh: Express và Hono.js

Nếu bạn đã biết Express, Hono.js sẽ mang lại cảm giác quen thuộc, chỉ là không có sự cồng kềnh của kỷ nguyên 2010. Express được xây dựng for runtime Node.js, vốn mang theo gánh nặng di sản đáng kể. Cloudflare Workers chạy trên V8 isolate engine—cùng một công nghệ tốc độ cao bên trong trình duyệt Chrome. Vì môi trường này không hỗ trợ toàn bộ thư viện tiêu chuẩn của Node.js, bạn cần một framework được xây dựng cho các Tiêu chuẩn Web (Web Standards) hiện đại.

  • Chi phí Runtime: Một container Express điển hình có thể tốn 200MB RAM chỉ để ở trạng thái chờ. Hono cực kỳ nhẹ, chỉ dưới 14KB. Nó được xây dựng hoàn toàn trên Fetch API, tạo cảm giác nguyên bản (native) với web hiện đại.
  • Trải nghiệm nhà phát triển (DX): Express dựa trên các mô hình callback cũ kỹ. Hono coi TypeScript là ưu tiên hàng đầu. Bạn nhận được tính năng tự động hoàn thiện (autocompletion) hoàn hảo trong IDE cho các route và biến của mình mà không cần cấu hình thêm.
  • Tốc độ điều hướng (Routing): Hono sử dụng RegexpRouter. Khác với phương pháp tìm kiếm tuyến tính được sử dụng bởi các framework cũ, Hono khớp các route trong thời gian hằng số. Ngay cả với hàng trăm endpoint, chi phí điều hướng của bạn vẫn không đáng kể.

Thực tế sau 6 tháng chạy Production

Những điểm cộng

Thành quả tức thì nhất là sự biến mất của cold start. Trên AWS Lambda, một hàm có thể mất hai giây để ‘thức dậy’ sau một thời gian không hoạt động. Cloudflare Workers khởi động trong chưa đầy 5 mili giây. Đối với người dùng, API mang lại cảm giác tức thời.

Hiệu quả chi phí thật đáng kinh ngạc. Chúng tôi đã thay thế một cụm máy chủ ảo tốn 120 USD/tháng bằng gói Cloudflare Workers 5 USD/tháng. Vì bạn chỉ trả tiền cho thời gian thực thi thực tế thay vì các chu kỳ CPU nhàn rỗi, hóa đơn hạ tầng của chúng tôi đã giảm khoảng 75%. Đối với một startup, đó là một lượng lớn nguồn lực dự phòng được khôi phục.

Sự linh hoạt về nhà cung cấp là lợi ích lớn thứ ba. Vì Hono tuân thủ các Web API tiêu chuẩn (Request/Response), mã nguồn không bị độc quyền. Nếu tôi muốn chuyển API này sang Deno, Bun hoặc một máy chủ Node.js tiêu chuẩn vào ngày mai, tôi có thể làm điều đó với rất ít thay đổi về code. Tôi không còn bị khóa chặt vào SDK của một nhà cung cấp đám mây cụ thể nào nữa.

Những thách thức

Không phải mọi thứ đều màu hồng. Môi trường V8 isolate có giới hạn bộ nhớ nghiêm ngặt 128MB ở gói tiêu chuẩn. Nếu bạn cần xử lý hình ảnh nặng hoặc thao tác với các tệp CSV khổng lồ trong bộ nhớ, bạn sẽ gặp rào cản. Bạn cũng không thể sử dụng các thư viện Node.js dựa trên C++ addons hoặc hệ thống tệp cục bộ. Bạn phải kiểm tra mọi dependency để đảm bảo nó ‘tương thích với Worker’ trước khi triển khai.

Cấu trúc Production khuyến nghị

Đừng chỉ nhồi nhét mọi thứ vào một tệp duy nhất. Để có một API dễ bảo trì, bạn cần một cấu trúc sạch sẽ khi mở rộng. Tôi thấy bố cục này hoạt động tốt nhất cho việc cộng tác nhóm.

project-root/
├── src/
│   ├── index.ts        # Điểm khởi đầu chính
│   ├── routes/         # Điều hướng theo tính năng (users, posts, v.v.)
│   ├── middleware/     # Xác thực, logging tùy chỉnh và CORS
│   └── db/             # Kết nối cơ sở dữ liệu D1 hoặc KV
├── wrangler.toml       # Biến môi trường và cấu hình
├── package.json
└── tsconfig.json

Tôi thực sự khuyên bạn nên sử dụng Wrangler, CLI của Cloudflare. Nó mô phỏng môi trường edge tại địa phương. Điều này giúp loại bỏ hiệu quả các lỗi ‘chạy tốt trên máy tôi’ vốn thường gây rắc rối trong phát triển serverless truyền thống.

Bắt đầu nhanh: Từ con số không đến Edge

Thiết lập rất nhanh chóng. Bạn có thể có một khung dự án sẵn sàng cho production trong khoảng ba mươi giây. Bắt đầu bằng cách chạy trình khởi tạo Hono.

npm create hono@latest my-api

Chọn `cloudflare-workers` khi lời nhắc xuất hiện. Đây là cách tôi cấu trúc một tệp `index.ts` tiêu chuẩn bao gồm các middleware thiết yếu và điều hướng sạch sẽ.

import { Hono } from 'hono'
import { logger } from 'hono/logger'
import { cors } from 'hono/cors'

const app = new Hono()

// Middleware toàn cục
app.use('*', logger())
app.use('/api/*', cors())

// Kiểm tra trạng thái hệ thống đơn giản
app.get('/', (c) => c.json({ status: 'trực tuyến', location: 'edge' }))

// Các route động
app.get('/api/user/:id', (c) => {
  const id = c.req.param('id')
  return c.json({
    userId: id,
    timestamp: Date.now()
  })
})

export default app

Kết nối dữ liệu

Một API nhanh cần dữ liệu nhanh. Cloudflare cung cấp D1, một cơ sở dữ liệu SQL serverless dựa trên SQLite. Truy cập nó trong Hono rất đơn giản và không yêu cầu logic kết nối rườm rà.

app.get('/api/posts', async (c) => {
  // Truy cập kết nối DB từ môi trường
  const { results } = await c.env.DB.prepare(
    'SELECT id, title FROM posts LIMIT 5'
  ).all()
  
  return c.json(results)
})

Triển khai trong 30 giây

Triển khai là phần tuyệt nhất của quy trình làm việc. Sau khi bạn đã xác thực, chỉ cần chạy:

npm run deploy

Mã của bạn được tối ưu hóa, đóng gói và đẩy tới hơn 300 trung tâm dữ liệu trên toàn cầu. Việc này diễn ra trong chưa đầy 30 giây. Tốc độ này đã thay đổi cách nhóm chúng tôi làm việc; giờ đây chúng tôi phát hành các bản cập nhật nhỏ, tịnh tiến nhiều lần trong ngày thay vì thực hiện các đợt phát hành lớn và đầy rủi ro hàng tuần.

Lời kết

Chuyển sang Hono.js trên Cloudflare Workers đã loại bỏ những phần tẻ nhạt nhất trong công việc của tôi. Tôi không còn phải dành những ngày cuối tuần để vá lỗi kernel Linux hay lo lắng về các nhóm tự động mở rộng (auto-scaling groups). Hạ tầng xử lý hàng triệu yêu cầu cũng dễ dàng như khi xử lý mười yêu cầu. Nếu bạn đang bắt đầu một dự án mới, hãy nhìn xa hơn stack Express truyền thống. Sự gia tăng hiệu suất cho người dùng và sự an tâm cho chính bạn là những điều quá tốt để có thể bỏ qua.

Share: