Durable Objects
Что это такое
Представьте единственного работника на ресепшене, который обслуживает по одному человеку за раз и помнит всех, кто приходил до этого, — никакой второй работник не даст противоречивого ответа. Durable Object — это тот самый работник в программном виде: крошечный сервер, который хранит собственную память (он «с состоянием», stateful), и Cloudflare гарантированно поддерживает его существующим ровно в одном месте в каждый момент времени. У каждого объекта есть уникальный ID, собственное постоянное хранилище, и он обрабатывает запросы по одному за раз, поэтому это естественный дом для координации — счётчики, блокировки, игровые комнаты, чат-сессии. Если Worker забывает всё между запросами (он «без состояния», stateless) и работает повсюду, то Durable Object помнит и единственен.
Сильные стороны
- Гарантия единственного экземпляра — никаких гонок между репликами.
- Встроенное постоянное хранилище (теперь на основе SQLite), расположенное вместе с объектом.
- Идеален для приложений реального времени: WebSockets (живое двустороннее соединение, которое остаётся открытым, чтобы сервер мог мгновенно отправлять обновления), присутствие, живая совместная работа.
- Строгая согласованность: чтение после записи внутри объекта происходит немедленно.
- Будильники (alarms) позволяют объекту планировать собственную будущую работу.
Компромиссы
- Однопоточность на объект — «горячий» объект может стать узким местом; шардируйте по ключу.
- Больше моментов для обдумывания, чем у обычного Worker'а; границы объектов проектируете вы.
- Хранилище на объект ограничено; это не замена D1 (SQL-базы данных) или R2 (файлового хранилища) на масштабе.
- Избыточен для обработки запросов без состояния.
Когда это использовать
Прибегайте к Durable Objects, когда нужна координация или состояние на сущность: чат-комнаты, состояние многопользовательской игры, ограничители частоты, выбор лидера или живой документ, который множество клиентов редактируют одновременно.
Соответствие vibe coding
Durable Objects блистают на функциях реального времени, которые иначе капризны в реализации, и агент может сгенерировать класс, привязку и обработку WebSocket. Скажите ему, как шардировать — обычно по одному объекту на комнату, пользователя или документ, — чтобы один объект не сериализовал весь ваш трафик. Конфиг ниже объявляет класс Durable Object с миграцией.
# wrangler.toml
[[durable_objects.bindings]]
name = "ROOM"
class_name = "ChatRoom"
[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]
npx wrangler deploy