Bạn đã mệt mỏi với việc duy trì các cụm Kubernetes đắt đỏ, tinh chỉnh Auto-scaling groups trên AWS, hay chắp vá các pipeline CI/CD phức tạp chỉ để giữ cho một cửa hàng thương mại điện tử hoạt động? Chào mừng đến với kỷ nguyên Zero DevOps.
Trong bài viết này, chúng ta sẽ mổ xẻ Aura Store — một nền tảng thương mại điện tử Cloudflare Workers cấp production được xây dựng hoàn toàn trên hạ tầng Edge, vận hành bởi một Turborepo Monorepo. Tất cả những gì bạn thấy dưới đây đều được trích xuất trực tiếp từ codebase đang chạy thực tế.
1. Kiến trúc Turborepo Monorepo trong thực tế
Answer-first: Turborepo chia nhỏ hệ thống thương mại điện tử thành bốn ứng dụng độc lập — storefront-ui, admin-ui, public-api, và admin-api — cùng hai package dùng chung: database và contract. Sự phân tách này tối đa hóa tốc độ build thông qua task graph cache của Turborepo và thiết lập một ranh giới bảo mật cứng rắn giữa lớp giao diện công khai và công cụ quản trị nội bộ.
Việc gộp chung Admin API và Public API vào một backend duy nhất là lời mời gọi cho các lỗi leo thang đặc quyền (privilege escalation). Aura Store giữ chúng tách biệt hoàn toàn:
apps/storefront-ui: Giao diện người dùng hướng khách hàng (Next.js 15+) — được deploy lên Cloudflare Pages để render tại Edge.apps/public-api: Cloudflare Worker phục vụ cho storefront và các tích hợp bên thứ ba.apps/admin-api: Một Cloudflare Worker riêng biệt với middleware RBAC nghiêm ngặt. Không thể truy cập từ đường dẫn internet công cộng.packages/contract: Các Zod schema và OpenAPI spec — nguồn chân lý duy nhất (single source of truth) cho mọi payload của API.packages/database: Lược đồ Drizzle ORM và các migration cho Cloudflare D1.
Vì cả ứng dụng và package đều chia sẻ cùng một Turborepo workspace, bất kỳ thay đổi schema nào trong packages/contract hoặc packages/database sẽ được cập nhật cho tất cả các consumer tại thời điểm build — không cần phải tăng version thủ công.
2. Cloudflare D1 & Drizzle ORM: Dữ liệu quan hệ tại Edge
Answer-first: Cloudflare D1 (SQLite Edge) kết hợp với Drizzle ORM mang lại khả năng truy vấn quan hệ an toàn kiểu (type-safe), phân tán toàn cầu mà không cần quản lý connection pool. D1 đọc dữ liệu từ edge node gần người dùng nhất — loại bỏ độ trễ của việc gọi vòng về cơ sở dữ liệu gốc tập trung.
Xử lý dữ liệu quan hệ tại Edge từng là bài toán lớn nhất chưa có lời giải của kiến trúc Serverless. Cloudflare D1 đã thay đổi điều đó. Cấu hình wrangler.toml cho public-api cho thấy việc thiết lập đơn giản đến mức nào:
name = "public-api-worker"
compatibility_date = "2024-06-05"
compatibility_flags = ["nodejs_compat"]
[[d1_databases]]
binding = "DB"
database_name = "ecommerce-db"
database_id = "YOUR_D1_DATABASE_ID" # từ lệnh: wrangler d1 create <db-name>
preview_database_id = "local" # SQLite cục bộ khi chạy wrangler dev
migrations_dir = "../../packages/database/migrations"
Không có chuỗi kết nối (connection string) nào cần bảo vệ, không có connection pool nào phải tinh chỉnh, và không phải lo lắng về idle timeout. Worker nhận binding DB tại thời điểm chạy (runtime), và Drizzle ORM cung cấp tính an toàn kiểu toàn diện từ database schema trong packages/database cho đến tận API response.
Vượt ra ngoài D1, cùng một file wrangler.toml đó cũng kết nối phần còn lại của hệ sinh thái Cloudflare chỉ với vài dòng bổ sung:
[[kv_namespaces]]
binding = "CACHE_KV"
id = "YOUR_KV_NAMESPACE_ID" # từ lệnh: wrangler kv namespace create CACHE_KV
[[r2_buckets]]
binding = "PRODUCTS_R2"
bucket_name = "e-commerce"
[[queues.consumers]]
queue = "ecommerce-events-prod"
max_batch_size = 10
max_retries = 3
dead_letter_queue = "ecommerce-events-dlq"
KV cho caching, R2 cho object storage, và Queues để xử lý sự kiện bất đồng bộ — tất cả được gắn vào Worker mà không cần cung cấp thêm bất kỳ hạ tầng nào khác.
3. Điểm nhấn kiến trúc: Tự động tạo Mobile SDK
Answer-first: Thay vì phải bảo trì thủ công các HTTP client cho Flutter và iOS, hệ thống tự động sinh ra Dart và Swift SDK từ các Zod schema mỗi khi có lệnh merge vào nhánh main. Bất kỳ thay đổi nào ở packages/contract đều kích hoạt một pipeline GitHub Actions biên dịch OpenAPI JSON và đẩy code SDK mới nhất lên — không cần sự can thiệp của con người.
Đây là phần sắc bén nhất trong kiến trúc của Aura Store, và cũng là phần mà hầu như không có bài hướng dẫn Cloudflare nào đề cập đến. Các contract API được định nghĩa một lần duy nhất dưới dạng Zod schema trong packages/contract. Khi một PR được merge, pipeline sẽ chạy:
# Nguồn: .github/workflows/openapi-sdk.yml
- name: Generate OpenAPI JSON Spec
run: pnpm --filter @ecommerce/contract build:openapi
- name: Generate Dart SDK (Flutter)
run: |
openapi-generator-cli generate \
-i ./packages/contract/openapi.json \
-g dart \
-o ./sdks/dart \
--additional-properties=pubName=aura_api_sdk,pubVersion=1.0.0
- name: Generate Swift SDK (iOS)
run: |
openapi-generator-cli generate \
-i ./packages/contract/openapi.json \
-g swift5 \
-o ./sdks/swift \
--additional-properties=projectName=AuraApiSDK
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
commit-message: 'chore: auto-generate API SDKs from latest contracts'
branch: 'auto/sdk-update'
Pipeline sẽ mở một PR chứa các SDK đã được tạo lại. Các team Mobile chỉ việc merge nó và phát hành — không cần đọc changelog, không cần so sánh thủ công các payload JSON, và không còn lỗi sai kiểu dữ liệu (type mismatch) tại runtime.
4. Triển khai Zero DevOps: Không cần bảo trì CI/CD Pipeline
Answer-first: Zero DevOps có nghĩa là bạn chỉ cần push code lên nhánh main và yên tâm rời đi. Tích hợp GitHub gốc của Cloudflare sẽ phát hiện lệnh push, chạy quá trình build cho từng app trong workspace, và deploy toàn cầu trên hơn 300 thành phố. Không có Kubernetes manifest, không có Helm chart, không có Jenkins job nào cần người trông coi.
Mỗi ứng dụng trong Turborepo tương ứng với một Cloudflare project riêng biệt:
| Ứng dụng | Sản phẩm Cloudflare | Lệnh Build |
|---|---|---|
storefront-ui (Next.js) | Pages | pnpm run build --filter @ecommerce/storefront-ui |
admin-ui (Vite) | Pages | pnpm run build --filter @ecommerce/admin-ui |
public-api | Workers | Tự động đọc file apps/public-api/wrangler.toml |
admin-api | Workers | Tự động đọc file apps/admin-api/wrangler.toml |
Các Secrets được quản lý mà không cần file .env trong CI. Bạn chỉ cần cài đặt chúng một lần qua Wrangler CLI:
wrangler secret put STRIPE_WEBHOOK_SECRET
wrangler secret put JWT_SECRET
Đối với việc kiểm thử Stripe Webhook ở local, bạn có thể forward các sự kiện tới dev server của Worker đang chạy:
stripe listen --forward-to localhost:8787/api/webhooks/stripe
Stripe CLI sẽ in ra một giá trị STRIPE_WEBHOOK_SECRET; hãy dán nó vào file apps/public-api/.dev.vars. Môi trường dev phản chiếu chính xác môi trường production — cùng một luồng code, cùng một Worker runtime, cùng một D1 schema.
5. Câu hỏi thường gặp (FAQ): Kiến trúc Cloudflare E-commerce
Kiến trúc Zero DevOps là gì?
Zero DevOps là mô hình nơi các kỹ sư dành 100% thời gian của họ để viết product code thay vì vận hành máy chủ. Với hệ sinh thái Cloudflare, không có hệ điều hành nào cần vá lỗi, không có scaling group nào phải tinh chỉnh, và không có chứng chỉ load balancer nào cần xoay vòng. Nền tảng tự động xử lý tính sẵn sàng, phân phối toàn cầu, và giảm thiểu DDoS.
Tại sao dùng Cloudflare Workers thay vì AWS Lambda?
Sự khác biệt cốt lõi nằm ở mô hình runtime. AWS Lambda chạy bên trong một container gọn nhẹ yêu cầu phải cold-start — một lớp ảo hóa làm tăng thêm 100ms–500ms cho request đầu tiên. Cloudflare Workers chạy trên các V8 isolates: cùng một engine hỗ trợ Chrome, với chi phí cold start gần bằng không. Trên một mạng lưới phân tán toàn cầu với hơn 300 thành phố, hầu hết người dùng nhận được phản hồi dưới một mili-giây từ một edge node ở vị trí vật lý gần họ — mà không cần bất kỳ cấu hình geo-routing nào.
| AWS Lambda | Cloudflare Workers | |
|---|---|---|
| Runtime | Container (có thể bị cold start) | V8 isolates (loại bỏ cold start) |
| Độ trễ toàn cầu | Phụ thuộc vào vị trí origin | Dưới 1 mili-giây tại hơn 300 PoP |
| Cấu hình hạ tầng | VPC, subnet, IAM | Không có — deploy qua wrangler |
| Mô hình giá | Theo số lần gọi + thời lượng | Theo request (gói miễn phí hào phóng) |
Bạn xử lý dữ liệu quan hệ tại Edge như thế nào?
Thay vì điều hướng mọi truy vấn trở lại một máy chủ RDS tập trung ở us-east-1, hãy sử dụng Cloudflare D1. D1 là một cơ sở dữ liệu SQL phân tán toàn cầu được xây dựng trên SQLite. Drizzle ORM bao bọc D1 với một query builder an toàn kiểu hoàn toàn, do đó schema và truy vấn của bạn được xác thực tại thời điểm biên dịch (compile time) — không phải tại runtime ở production.
Đọc thêm: Tài liệu chính thức Cloudflare D1 · Tài liệu Turborepo · Dapr Pub/Sub cho microservices hướng sự kiện
Kiến trúc Serverless Edge không phải là tương lai. Nó là hiện tại. Khám phá thêm các mô hình kiến trúc hiện đại trong mục System Design Series và duyệt qua tất cả bài viết về Cloudflare và DevOps trên blog.
📬 Nhận Tech Radar hàng tuần — không có thư rác, chỉ có tín hiệu chất lượng: Đăng ký tại đây.