~/VibeHandbook
PDF miễn phí

Cloudflare

developers.cloudflare.com

Durable Objects

Đây là gì

Hãy hình dung một nhân viên lễ tân duy nhất, xử lý từng người một và nhớ tất cả những ai đã đến trước đó — không có nhân viên thứ hai nào có thể đưa ra câu trả lời mâu thuẫn. Durable Object chính là nhân viên lễ tân đó trong phần mềm: một máy chủ nhỏ tự lưu giữ bộ nhớ của riêng nó (nó "có trạng thái" — stateful), và Cloudflare đảm bảo nó chỉ tồn tại ở đúng một nơi tại một thời điểm. Mỗi object có một ID duy nhất, kho lưu trữ vĩnh viễn của riêng nó, và xử lý các yêu cầu lần lượt từng cái một — vì vậy nó là nơi tự nhiên để xử lý việc điều phối: bộ đếm, khóa (lock), phòng chơi game, phiên trò chuyện. Trong khi một Worker quên hết mọi thứ giữa các yêu cầu (nó "không có trạng thái" — stateless) và chạy ở khắp mọi nơi cùng lúc, thì một Durable Object thì ghi nhớ và chỉ tồn tại duy nhất một bản.

Điểm mạnh

  • Đảm bảo chỉ có một thực thể duy nhất — không có tình trạng tranh chấp dữ liệu (race condition) giữa các bản sao.
  • Kho lưu trữ bền vững tích hợp sẵn (nay được hỗ trợ bởi SQLite), đặt cùng vị trí với object.
  • Lý tưởng cho các ứng dụng thời gian thực: WebSocket (một kết nối hai chiều, trực tiếp, luôn mở để máy chủ có thể đẩy cập nhật tức thì), trạng thái hiện diện (presence), cộng tác trực tiếp.
  • Tính nhất quán mạnh: đọc ngay sau khi ghi (read-after-write) trong một object là tức thời.
  • Alarm cho phép một object tự lên lịch cho công việc tương lai của chính nó.

Đánh đổi

  • Đơn luồng cho mỗi object — một object "nóng" (bị gọi nhiều) có thể trở thành nút thắt cổ chai; hãy chia nhỏ (shard) theo khóa.
  • Cần suy nghĩ nhiều hơn so với một Worker thông thường; bạn phải tự thiết kế ranh giới của các object.
  • Dung lượng lưu trữ cho mỗi object có giới hạn; đây không phải là thứ thay thế cho D1 (một cơ sở dữ liệu ) hay R2 (lưu trữ tệp) ở quy mô lớn.
  • Là lựa chọn quá mức cần thiết (overkill) cho việc xử lý các yêu cầu không trạng thái.

Khi nào nên dùng

Hãy chọn Durable Objects khi bạn cần sự điều phối hoặc trạng thái theo từng thực thể: phòng trò chuyện, trạng thái game nhiều người chơi, bộ giới hạn tốc độ (rate limiter), bầu chọn leader (leader election), hoặc một tài liệu trực tiếp mà nhiều người dùng cùng chỉnh sửa một lúc.

Phù hợp với vibe coding

Durable Objects tỏa sáng ở những tính năng thời gian thực vốn rất rắc rối khi phải tự xây dựng, và một có thể dựng sẵn khung class, binding, và phần xử lý WebSocket. Hãy nói cho nó biết cách chia nhỏ (shard) — thường là một object cho mỗi phòng, mỗi người dùng, hoặc mỗi tài liệu — để một object duy nhất không phải xử lý tuần tự toàn bộ lưu lượng truy cập của bạn. Đoạn cấu hình dưới đây khai báo một class Durable Object cùng với một migration.

# wrangler.toml
[[durable_objects.bindings]]
name = "ROOM"
class_name = "ChatRoom"

[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]
npx wrangler deploy