Bỏ qua tới nội dung
Quay lại danh sách bài viết
Infrastructure15分

Phân tích chuyên sâu Cloudflare Workers & Durable Objects: Trạng thái tại edge

Cloudflare Workers & Durable Objects Deep Dive: Designing Global State Machines

村田 聡Principal Edge Architect
2026-04-2115分
CloudflareWorkersDurable ObjectsWASMRustTypeScriptEdge Computing

Tổng quan về nền tảng Workers

Cloudflare Workers là FaaS dựa trên V8 Isolate, tính đến tháng 4 năm 2026 cùng một code được deploy ngay lập tức tới hơn 330 PoP trên toàn thế giới. Cold start gần như bằng không trên thực tế (dưới 5ms cho hầu hết các request), nhưng do sử dụng Isolate thay vì khởi động container như AWS Lambda, các module native của Node.js và blocking I/O dài hạn về bản chất không phù hợp. nodejs_compat_v2 đã GA vào cuối năm 2025 cải thiện đáng kể khả năng tương thích với fs/crypto/stream, nhưng nếu không hiểu "cách làm của Isolate", bạn vẫn sẽ va phải giới hạn subrequest (1000) hay giới hạn CPU time (5 phút ở gói trả phí).

Workers thực sự phát huy giá trị khi kết hợp logic có trạng thái với Durable Objects. Durable Object (sau đây gọi là DO) là "actor có ID duy nhất toàn cầu, đơn luồng, có tính nhất quán mạnh", các request đến cùng một DO luôn được serialize. Mô hình này được thiết kế như "thay thế mutex ở edge", cho phép hoàn thành cục bộ mà không cần RTT cho "giới hạn tốc độ theo người dùng", "tín hiệu theo phòng họp", "phân bổ tồn kho theo ID giao dịch" — những thứ trước đây được triển khai bằng Redis hay advisory lock của Postgres.

Mô hình transaction của Durable Objects

Storage lâu dài của DO cung cấp storage API dựa trên SQLite nội bộ. Kể từ khi SQLite-backed DO được mở cho tất cả các gói vào năm 2025, có thể lưu trữ dữ liệu quan hệ lên đến 10GB mỗi DO, và thực thi nguyên tử nhiều put/delete trong callback transaction(). Điểm quan trọng là DO tích hợp "input gate" và "output gate". Input gate chặn request mới trong khi đợi ghi storage trong quá trình xử lý request, output gate giữ response fetch cho đến khi ghi storage được lưu trữ lâu dài. Nhờ hai cổng kép này, code ứng dụng có thể viết async/await tự do mà không bị phá vỡ tính nhất quán.

```typescript export class InventoryDO { state: DurableObjectState; constructor(state: DurableObjectState) { this.state = state; } async fetch(req: Request) { const { sku, qty } = await req.json<{ sku: string; qty: number }>(); return await this.state.storage.transaction(async (tx) => { const current = (await tx.get<number>(sku)) ?? 0; if (current < qty) return new Response("oos", { status: 409 }); await tx.put(sku, current - qty); return new Response(JSON.stringify({ remain: current - qty })); }); } } ```

Lỗi phổ biến khi sử dụng DO như actor là thiết kế "xử lý tất cả tenant bằng 1 DO". Khi DO trở thành hotspot, PoP bị cố định và người dùng ở xa phải chịu RTT cao. Cách đúng là sharding bằng cách nối "tenant ID + resource ID" với idFromName(), và đảm bảo các write có tính cục bộ địa lý. Đọc có thể trả về trong O(1) từ replica không đồng bộ bằng replica DO (GA năm 2025).

Phân biệt sử dụng Workers KV, Hyperdrive, D1

Ba lớp dữ liệu có mục đích rõ ràng khác nhau. Workers KV là store tối ưu hóa đọc nhất quán cuối cùng, phù hợp với cài đặt/metadata có thể chấp nhận truyền trong vòng 60 giây. Độ trễ truyền PUT từ vài giây đến 60 giây, đọc trả về trong 1ms từ cache PoP cục bộ. Hyperdrive là connection pooler cho Postgres/MySQL bên ngoài, tái sử dụng kết nối TCP đến origin và cache kết quả query ở PoP. Đây là bước thực tế nhất đầu tiên cho các tổ chức có tài sản RDB hiện có khi chuyển sang edge. D1 là RDB dựa trên SQLite của Cloudflare, read replica đã GA năm 2025, có thể có topology kiểu PostgreSQL là write vào primary, read từ replica gần nhất.

Tiêu chí lựa chọn được phân tích bằng "tần suất write" và "yêu cầu nhất quán". Nếu hơn 1000 write mỗi giây và có thể phân tách theo tenant thì dùng DO; ít write toàn cục + read phân tán địa lý thì dùng D1; đã có DB bên ngoài thì Hyperdrive; phân phối cài đặt dựa trên TTL thì KV. R2 (object storage tương thích S3) trực giao với những cái này và được dùng cho phân phối video, backup, data lake nhờ đặc tính miễn phí egress.

Workers AI và định tuyến suy luận

Workers AI kể từ khi GA năm 2024 có thể gọi các model OSS chính như Llama 3.3 70B, Mistral Large 2, GPT-OSS-120B, Qwen 3 theo hình thức pay-per-use. Hiện tại năm 2026, có thể định tuyến OpenAI/Anthropic/Google qua cùng một API (AI Gateway) với BYOK, với ưu điểm là cache response, retry và rate limiting được quản lý thống nhất ở Workers. Log của AI Gateway chảy vào Analytics Engine, nên có thể query chi phí token theo từng prompt bằng SQL.

Best practice tối ưu latency là hybrid "suy luận nhỏ dùng local inference của Workers AI, suy luận phức tạp dùng LLM bên ngoài". Ví dụ, phán định Bot, phân loại NSFW, phát hiện đa ngôn ngữ được xử lý bằng Llama Guard/Llama-3 8B của Workers AI, và chỉ khi kết quả "không chắc chắn" mới escalate lên Claude hay GPT — routing hai giai đoạn này. Chúng tôi đã xác nhận nhiều trường hợp giảm chi phí 70% tại khách hàng của KGA.

Tối ưu hóa hot path bằng Rust + WASM binding

TypeScript 5ms, Rust + WASM 0,8ms. Khi sự chênh lệch này ảnh hưởng ở 100.000 request mỗi giây, nó có tác động trực tiếp đến ngân sách CPU time. workers-rs (Rust crate) có thể biên dịch vào runtime Workers với macro `#[event(fetch)]`, và có thể truy cập Workers API (fetch/crypto/R2) qua wasm-bindgen. Viết lại API gateway nặng về parse JSON, xác minh HMAC, xác minh JWT, resize ảnh bằng Rust có hiệu quả giảm chi phí lớn.

```rust use worker::*; #[event(fetch)] async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> { let body: serde_json::Value = req.json().await?; let signature = req.headers().get("x-signature")?.unwrap_or_default(); if !verify_hmac(&body, &signature, &env.secret("HMAC_KEY")?.to_string()) { return Response::error("invalid signature", 401); } Response::ok("ok") } ```

Lưu ý, nên giữ kích thước module WASM dưới 10MB; kết hợp wasm-opt -Oz và wee_alloc có thể giảm một nửa kích thước thực tế. Chi phí khởi động gần như có thể bỏ qua nhờ tái sử dụng Isolate, nhưng lần biên dịch đầu tiên mất 20-50ms, nên ở các PoP có traffic cực thấp, TypeScript đôi khi nhanh hơn. Benchmark phải được thực hiện trên PoP production là điều bắt buộc.

Pattern xây dựng state machine toàn cầu

Sự kết hợp WebSocket Hibernation + Durable Objects đã trở thành định dạng chuẩn cho chỉnh sửa cộng tác thời gian thực, tín hiệu phát trực tiếp, điều phối thiết bị IoT. Nhờ Hibernation API, kết nối WebSocket có thể được mở trong khi giải phóng bộ nhớ, và tính phí DO chỉ theo "thời gian hoạt động". Cấu trúc chi phí mà dù duy trì 1 triệu kết nối vẫn chỉ vài nghìn USD mỗi tháng đang tạo động lực để tự tạo lại các dịch vụ kiểu Ably hay Pusher.

Nuance thiết kế là đối xử với DO như "node đơn của state machine". Chuyển đổi trạng thái cập nhật state version bằng CAS trong storage.transaction, sự kiện bên ngoài được kích hoạt qua Queues. Compensating transaction khi thất bại có thể được thực thi trễ bằng alarm() API. Điều này cho phép tổ chức pattern saga "bắt đầu ở edge, kết thúc ở edge" với latency thấp. Kiến trúc không quay lại origin là chiến trường chính của thiết kế hệ thống phân tán năm 2026.

Cùng giải quyết các thách thức kỹ thuật của bạn.

KGA IT Solutions có đội ngũ chuyên gia AI, cloud và DevOps mang lại giải pháp tối ưu cho thách thức của bạn.

Liên hệ