Khoảng cách Latency trong Kiến trúc Serverless
Điện toán Serverless từng hứa hẹn về khả năng mở rộng vô hạn và không cần bảo trì. Tuy nhiên, trong nhiều năm, database vẫn là một nút thắt cổ chai khó gỡ. Tôi nhớ khi triển khai Cloudflare Worker đầu tiên của mình cho người dùng toàn cầu. Trong khi việc thực thi mã cực kỳ nhanh—chưa đầy 10ms—thì thời gian phản hồi thực tế cho người dùng ở Singapore lại chậm chạp ở mức 320ms. Nút thắt cổ chai rất rõ ràng: database của tôi bị kẹt ở một vùng AWS duy nhất tại North Virginia (us-east-1).
Dù bạn thích MySQL, PostgreSQL hay MongoDB, các database tập trung truyền thống sẽ tạo ra một bức tường vật lý khi bạn đưa logic ra vùng biên (edge). Mỗi khi người dùng tương tác với ứng dụng, tín hiệu phải di chuyển hàng ngàn dặm chỉ để lấy vài byte dữ liệu. Độ trễ khứ hồi này về cơ bản sẽ triệt tiêu mọi lợi ích hiệu năng mà edge computing mang lại ban đầu.
Nguyên nhân gốc rễ: Khoảng cách và Sự cồng kềnh của kết nối
Có hai yếu tố chính làm giảm hiệu suất trong các ứng dụng serverless: khoảng cách địa lý và overhead (chi phí vận hành) của kết nối. Các database quan hệ tiêu chuẩn như PostgreSQL không được xây dựng cho bản chất “chớp nhoáng” của các serverless function. Chúng kỳ vọng các kết nối ổn định và lâu dài. Khi một function khởi chạy, nó thường mất từ 50ms đến 100ms chỉ để thực hiện bắt tay (handshake) với database. Cộng thêm khoảng cách vật lý, trải nghiệm người dùng của bạn sẽ bắt đầu trở nên chậm chạp.
Cloudflare D1 khắc phục điều này bằng cách đặt dữ liệu chính xác tại nơi mã nguồn thực thi. Được xây dựng trên SQLite, D1 là một serverless SQL database bản địa, kết nối trực tiếp vào mạng lưới của Cloudflare. Bạn không cần lo lắng về việc quản lý connection pooling phức tạp hay thiết lập các đường ống VPC chỉ để truy cập dữ liệu.
So sánh các mô hình kiến trúc
Để hiểu tại sao D1 là một bước chuyển mình quan trọng, hãy nhìn vào các con số và cấu trúc sau.
1. Mô hình tập trung (Cách làm cũ)
- Database: Managed RDS tại
us-east-1. - Compute: Các Edge Function phân tán.
- Vấn đề: Latency cao (200ms+) cho người dùng toàn cầu. Bạn cũng cần một proxy như PgBouncer để ngăn database bị treo khi lưu lượng truy cập tăng đột biến.
2. Mô hình Edge-Native (Cloudflare D1)
- Database: D1 (SQLite) nằm tại các điểm hiện diện (PoP) toàn cầu của Cloudflare.
- Compute: Cloudflare Workers.
- Kết quả: Gần như không có overhead kết nối. Dữ liệu được sao chép hoặc lưu bộ nhớ đệm gần người dùng, thường giúp giảm Time to First Byte (TTFB) xuống dưới 50ms bất kể vị trí địa lý.
Ưu và nhược điểm của mô hình D1
Không có công cụ nào là vạn năng. Bạn nên hiểu rõ các đánh đổi trước khi chuyển toàn bộ hệ thống production sang SQLite-tại-edge.
Ưu điểm
- Zero Config: Quên đi việc quản lý mật khẩu hay danh sách IP được phép. Bạn truy cập database thông qua một binding đơn giản trong file cấu hình.
- Giá cả dễ dự đoán: D1 cung cấp gói miễn phí hào phóng (5 triệu hàng đọc mỗi ngày). Với gói trả phí, bạn chỉ trả tiền cho những gì bạn sử dụng, thường chỉ bằng một phần nhỏ chi phí của một instance RDS chạy 24/7.
- SQL tiêu chuẩn: Bạn không phải học một ngôn ngữ truy vấn riêng biệt. Nếu bạn có thể viết một câu lệnh
SELECTcơ bản trong SQLite, bạn đã biết cách dùng D1.
Hạn chế
- Giới hạn kích thước: D1 được thiết kế cho tốc độ, không phải cho lưu trữ khối lượng lớn. Mặc dù giới hạn gần đây đã tăng lên 10GB mỗi database cho gói trả phí, nó vẫn không phải là lựa chọn phù hợp để lưu trữ hàng terabyte dữ liệu log.
- Phương ngữ SQLite: SQLite rất tinh gọn. Nó thiếu một số tính năng nâng cao có trong Postgres, chẳng hạn như các window function cụ thể hoặc các kiểu dữ liệu tùy chỉnh như
JSONB.
Stack Serverless hiện đại
Nếu bạn bắt đầu một dự án mới hôm nay, tôi khuyên dùng sự kết hợp này để có trải nghiệm lập trình tốt nhất:
- Ngôn ngữ: TypeScript để bắt lỗi trước khi đưa lên production.
- Framework: Hono—một web framework siêu nhỏ, nhanh chớp nhoáng được xây dựng cho edge.
- ORM: Drizzle ORM. Nó nhẹ và hỗ trợ type safety hoàn chỉnh cho các truy vấn SQL của bạn.
- CLI: Wrangler cho mọi thao tác triển khai.
Thực thi: Xây dựng danh mục sản phẩm
Dưới đây là cách bạn có thể thiết lập database D1 và kết nối nó với một Worker trong chưa đầy năm phút.
Bước 1: Khởi tạo dự án
Mở terminal và chạy trình khởi tạo của Cloudflare:
npm create cloudflare@latest my-d1-app
# Chọn Worker "Hello World"
# Chọn TypeScript
cd my-d1-app
Bước 2: Khởi tạo Database
Tạo instance database của bạn bằng Wrangler CLI. Việc này sẽ tự động đăng ký database trong bảng điều khiển Cloudflare của bạn.
npx wrangler d1 create product-db
Sao chép ID được cung cấp trong terminal và dán vào file wrangler.toml của bạn:
[[d1_databases]]
binding = "DB"
database_name = "product-db"
database_id = "id-database-duy-nhat-cua-ban"
Bước 3: Tạo các bảng
Định nghĩa cấu trúc trong file schema.sql tại thư mục gốc của dự án.
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO products (name, price) VALUES ('Bàn phím cơ', 99.99), ('Hub USB-C', 49.50);
Đẩy schema này lên cả môi trường local và database production của bạn:
# Để test local
npx wrangler d1 execute product-db --local --file=./schema.sql
# Cho database thực tế trên Cloudflare
npx wrangler d1 execute product-db --remote --file=./schema.sql
Bước 4: Truy xuất dữ liệu trong Worker
Cập nhật src/index.ts để xử lý các request đến. Chúng ta sẽ sử dụng binding DB để truy vấn sản phẩm.
export interface Env {
DB: D1Database;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { pathname } = new URL(request.url);
if (pathname === "/products") {
const { results } = await env.DB.prepare(
"SELECT * FROM products"
).all();
return Response.json(results);
}
return new Response("Không tìm thấy", { status: 404 });
},
};
Bước 5: Triển khai
Kiểm tra mọi thứ ở local để đảm bảo các truy vấn hoạt động như mong đợi:
npx wrangler dev
Khi bạn đã sẵn sàng, hãy đưa nó lên mạng lưới toàn cầu của Cloudflare chỉ với một câu lệnh:
npx wrangler deploy
Lời kết
Chuyển từ một instance MySQL tập trung sang Cloudflare D1 mang lại cảm giác giống như nâng cấp từ ổ cứng HDD cũ kỹ sang ổ SSD NVMe. Tốc độ tăng vọt một cách rõ rệt. Mặc dù D1 vẫn đang trong quá trình hoàn thiện, nó cung cấp một quy trình làm việc SQL quen thuộc nhưng thực sự hiệu quả tại edge. Nếu bạn đang xây dựng các API có lưu lượng truy cập cao hoặc các ứng dụng thời gian thực nơi mỗi mili giây đều ảnh hưởng đến việc giữ chân người dùng, D1 hiện là một trong những cách hiệu quả nhất để quản lý dữ liệu mà không gặp phải nỗi lo về cơ sở hạ tầng.

