advanced
Durable Objects
Координация stateful edge-логики per-key: сессии, коллаборация, rate limiting или строго упорядоченные операции.
Durable Objects (DO) дают single-threaded strongly consistent state по ID — WebSocket-комнаты, collaborative editing, per-user rate limiters или ordered job processing на edge. Каждый инстанс DO сериализует запросы: in-memory state плюс опциональный SQLite без race conditions.
export class ChatRoom {
async fetch(request: Request) {
// один инстанс на roomId — упорядоченная обработка сообщений
const msg = await request.json();
this.messages.push(msg);
return Response.json({ ok: true });
}
}
// wrangler: new ChatRoom() bound to env.ROOM
| Кейс | Зачем DO | |------|----------| | WebSocket hub | Один координатор на комнату | | Rate limiter | Точные counters per-key | | Leader election | Один writer на shard | | Strong ordering | Без lost updates vs KV |
Маршрутизируйте через `idFromName(roomId)`, чтобы один key всегда попадал в один object. DO hibernate при idle; state восстанавливается из storage при пробуждении.
На интервью: DO vs KV vs origin Redis, hibernation, лимиты масштаба на object, архитектура WebSocket и recovery после сбоев.
Типовые ошибки: один DO как global bottleneck; тяжёлый CPU в hot object; забытая persistence при hibernate; DO как универсальная БД.
Компромисс — strong per-key consistency и простая координация против лимитов horizontal scale на object и сложности эксплуатации.
Чеклист:
- Шардируйте hot keys по многим DO ID.
- Persist критичный state в DO storage.
- Быстрая I/O-aware логика внутри object.
- WebSocket API для real-time fan-out.