denoland/celld
self-hosted, distributed Durable Objects
Kết luận: partial · Công nghệ: durable-objects · distributed-systems · stateful-services · self-hosted · rust
celld là một nền tảng tự host để chạy mô hình Durable Objects phân tán: giữ state theo object, định tuyến theo key và đồng bộ qua nhiều node. Phù hợp khi cần actor/stateful service có locality và persistence, nhưng đây vẫn là lựa chọn nên thử nghiệm có kiểm soát hơn là mặc định đưa vào production rộng rãi.
📖 Giới thiệu chi tiết
🧩 Nó là gì?
denoland/celld là một daemon mã nguồn mở để tự chạy Cloudflare Workers và Durable Objects trên máy/chùm máy của bạn. Nói đơn giản: nó giúp bạn chạy các “object có state” phân tán, mỗi object có dữ liệu riêng và có thể được chuyển giữa nhiều node.
🎯 Giải quyết vấn đề gì? Dành cho ai?
celld giải quyết bài toán xây ứng dụng cần state theo từng object mà không muốn dồn tất cả vào một database chung.
Ví dụ dễ hiểu:
- Bạn có nhiều phòng chat, mỗi phòng giữ lịch sử/trạng thái riêng.
- Mỗi user, game session, document, cart, room... cần một “bộ nhớ” riêng.
- Bạn muốn chia tải tự nhiên theo key/object thay vì tự thiết kế sharding phức tạp.
- Bạn muốn tự host thay vì phụ thuộc hoàn toàn vào Cloudflare.
celld phù hợp với:
- Người đã quen hoặc muốn dùng mô hình Durable Objects.
- Đội cần chạy workload stateful trên hạ tầng riêng.
- Ứng dụng cần locality: dữ liệu và logic của một object nằm gần nhau để xử lý nhanh, gọn.
- Hệ thống thử nghiệm hoặc triển khai có kiểm soát, nơi bạn chấp nhận công nghệ còn đang phát triển.
Một cách hình dung: thay vì có một database lớn cho cả hệ thống, celld chia ứng dụng thành nhiều “cell” nhỏ. Mỗi cell là một object có database SQLite riêng.
⚙️ Hoạt động ra sao?
- Mỗi node
celldnhúng V8 để chạy bundle kiểu Worker, tương tự môi trường chạy JavaScript của Cloudflare Workers. - Mỗi Durable Object được gọi là một “cell”, và mỗi cell có một SQLite database riêng.
- Các cell được định danh bằng tên/key, nên request đến đúng object sẽ được định tuyến tới node đang sở hữu object đó.
- Toàn bộ fleet dùng chung một bucket tương thích S3 để lưu deployment, state của cell và thông tin ownership.
- Bucket S3-compatible là “nguồn sự thật bền vững”: node có thể hỏng/thay thế, state vẫn được khôi phục từ bucket.
cellddùng cơ chế compare-and-swap trên object storage để đảm bảo tại một thời điểm chỉ có một node sở hữu một cell.- Không cần control plane, membership service, failure detector hay consensus service riêng.
- Khi cell rảnh, nó có thể “ngủ đông” để dùng rất ít tài nguyên.
- Khi cell chuyển sang node khác hoặc được đánh thức lại, node mới tải SQLite database từ bucket và tiếp tục chạy.
- Các node phát hiện peer và owner thông qua lease record trong bucket.
Một số khái niệm nhanh:
- Durable Objects: mô hình lập trình trong đó mỗi object có logic và state riêng, tồn tại bền vững qua nhiều request.
- SQLite: database dạng file nhỏ gọn, mỗi cell trong
celldcó một SQLite database riêng. - S3-compatible bucket: nơi lưu object giống Amazon S3, ví dụ AWS S3, Cloudflare R2 hoặc dịch vụ tương thích khác.
- Fleet: nhóm node
celldcùng chạy một ứng dụng và dùng chung bucket.
🆚 Khi nào nên dùng / không nên
Nên dùng celld khi:
- Bạn muốn tự host mô hình giống Durable Objects.
- Ứng dụng của bạn chia tự nhiên theo object/key, ví dụ room, session, user, tenant, document.
- Bạn muốn giảm rủi ro “một database chung bị nghẽn là cả hệ thống ảnh hưởng”.
- Bạn cần state nằm gần code xử lý, thay vì mọi request đều phải đi xa tới database trung tâm.
- Bạn chấp nhận vận hành bucket, node, credential và mạng nội bộ an toàn.
Không nên dùng celld khi:
- Bạn chỉ cần API stateless đơn giản; khi đó một server HTTP bình thường có thể đủ.
- Bạn cần database quan hệ tập trung với query phức tạp xuyên nhiều bảng/object.
- Bạn chưa muốn vận hành hạ tầng phân tán.
- Bạn cần một nền tảng đã cực kỳ ổn định cho production lớn ngay lập tức.
- Bạn không có mạng private hoặc overlay an toàn giữa các node.
So sánh ngắn:
- So với Cloudflare Durable Objects:
celldcho bạn tự host trên máy/bucket của mình, nhưng bạn phải tự vận hành nhiều thứ hơn. - So với một database chung như PostgreSQL:
celldchia state thành nhiều object nhỏ ngay từ thiết kế, nhưng không thay thế hoàn toàn database quan hệ cho các truy vấn tổng hợp/phức tạp. - So với service stateless:
celldphù hợp hơn khi mỗi object cần giữ state riêng lâu dài.
🚀 Bắt đầu nhanh
Cài celld:
curl -fsSL https://celld.dev/install.sh | sh
Nếu installer yêu cầu, thêm ~/.local/bin vào PATH.
Nếu project Worker của bạn cần build code, hãy đảm bảo có esbuild trên PATH. Project chỉ có static assets thì không cần.
Deploy project hiện tại lên bucket:
celld deploy . \
--bucket s3://my-cells-bucket
Chạy celld trỏ tới cùng bucket:
celld \
--bucket s3://my-cells-bucket \
--listen 0.0.0.0:8080 \
--advertise 10.0.0.12:8080
Nếu dùng dịch vụ S3-compatible khác, ví dụ Cloudflare R2, thêm --endpoint và --region:
celld \
--bucket s3://my-cells-bucket \
--endpoint https://ACCOUNT.r2.cloudflarestorage.com \
--region auto \
--listen 0.0.0.0:8080 \
--advertise node-a.internal:8080
Chạy bằng Docker:
docker run --rm ghcr.io/denoland/celld --version
Ví dụ Docker có volume state và AWS credential:
docker volume create celld-state
docker run --rm --network host \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e CELLD_WATCH=/var/lib/celld/state \
-v celld-state:/var/lib/celld \
ghcr.io/denoland/celld \
--bucket s3://my-cells-bucket \
--endpoint https://ACCOUNT.r2.cloudflarestorage.com \
--region auto \
--listen 0.0.0.0:8080 \
--advertise node-a.internal:8080
Kiểm tra fleet:
celld diagnose --bucket s3://my-cells-bucket
Gỡ cài đặt:
curl -fsSL https://celld.dev/uninstall.sh | sh
Build từ source:
cargo build --locked
cargo test --locked
cargo clippy --all-targets --locked -- -D warnings
Lưu ý quan trọng khi chạy nhiều node:
- Mỗi node cần
--advertisekhác nhau và địa chỉ này phải được các peer truy cập được. - Peer HTTP không tự terminate TLS, nên nên đặt trong mạng private hoặc overlay an toàn như WireGuard/Tailscale.
- Không publish trực tiếp peer port ra internet.
- Quyền truy cập bucket và credential nên được xem như quyền quản trị toàn bộ fleet.
✅ Điểm mạnh & ⚠️ Hạn chế
Điểm mạnh:
- Tự host được mô hình Durable Objects trên hạ tầng của bạn.
- Mỗi object có SQLite database riêng, giúp chia tải tự nhiên theo object.
- Không cần control plane hoặc consensus service riêng.
- Node có thể thay thế; state bền vững nằm trong bucket S3-compatible.
- Cell rảnh có thể hibernate để tiết kiệm tài nguyên.
- Có lệnh
celld diagnoseđể kiểm tra node lease, peer, protocol và một số chỉ số vận hành.
Hạn chế:
- Runtime và bề mặt tương thích vẫn đang phát triển.
- Nên thử nghiệm có kiểm soát trước khi dùng rộng rãi trong production.
- Bạn phải tự vận hành bucket, credential, network và bảo mật giữa các node.
- Không phù hợp cho truy vấn dữ liệu phức tạp xuyên nhiều object như một database quan hệ truyền thống.
- Peer HTTP cần mạng tin cậy hoặc overlay mã hóa; không nên mở trực tiếp ra internet.
- Pull requests bị tắt; nếu muốn đóng góp cần gửi
git format-patchqua email theo hướng dẫn của repo.