~/VibeHandbook

Cloudflare

developers.cloudflare.com

Durable Objects

Что это такое

Durable Object — это крошечный сервер с состоянием, который Cloudflare гарантированно поддерживает существующим ровно в одном месте в каждый момент времени. У каждого объекта есть уникальный ID, собственное постоянное хранилище, и он обрабатывает запросы по одному за раз, поэтому это естественный дом для координации — счётчики, блокировки, игровые комнаты, чат-сессии. Если Worker не имеет состояния и работает повсюду, то Durable Object имеет состояние и единственен.

Сильные стороны

  • Гарантия единственного экземпляра — никаких гонок между репликами.
  • Встроенное постоянное хранилище (теперь на основе SQLite), расположенное вместе с объектом.
  • Идеален для приложений реального времени: WebSockets, присутствие, живая совместная работа.
  • Строгая согласованность: чтение после записи внутри объекта происходит немедленно.
  • Будильники (alarms) позволяют объекту планировать собственную будущую работу.

Компромиссы

  • Однопоточность на объект — «горячий» объект может стать узким местом; шардируйте по ключу.
  • Больше моментов для обдумывания, чем у обычного Worker'а; границы объектов проектируете вы.
  • Хранилище на объект ограничено; это не замена D1 или 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