← Cloudflare Durable Objects / durable-objects / concepts
Что такое Durable Objects?
Durable Object представляет собой особый вид Cloudflare Worker который уникальным образом объединяет вычисления и хранение данных. Как и Worker, Durable Object автоматически создается географически близко к месту первого запроса, быстро запускается при необходимости и завершает работу при простое. По всему миру их может быть миллионы. Однако, в отличие от обычных Workers:
- Каждый Durable Object имеет глобально уникальное имя, что позволяет отправлять запросы к конкретному объекту из любой точки мира. Таким образом, Durable Object можно использовать для координации работы нескольких клиентов, которым нужно взаимодействовать друг с другом.
- Каждый Durable Object имеет некоторое надёжное хранилище подключено. Поскольку это хранилище существует вместе с объектом, оно строго консистентно и при этом быстро в доступе.
Поэтому Durable Objects позволяют с состоянием бессерверных приложений.
Ключевые особенности Durable Objects
Durable Objects обладают свойствами, которые делают их отличным решением для распределённых масштабируемых stateful приложений.
Бессерверные вычисления без управления инфраструктурой
- Durable Objects построены поверх среды выполнения Workers, поэтому поддерживают точно такой же код (JavaScript и WASM), а также имеют схожие ограничения по памяти и CPU.
- Каждый Durable Object создаётся неявно при первом обращении. Приложениям пользователя не нужно заботиться об их жизненном цикле, создании или удалении. Durable Objects мигрируют между исправными серверами, поэтому приложениям никогда не приходится заниматься их управлением.
- Каждый Durable Object остаётся активным, пока обрабатываются запросы, и продолжает оставаться активным ещё несколько секунд после простоя перед переходом в спящий режим, позволяя приложениям использовать кэширование в оперативной памяти при обработке большого количества последовательных запросов, повышая их производительность.
Хранилище, совмещённое с вычислениями
- Каждый Durable Object имеет своё надёжное, транзакционное и строго согласованное хранилище (до 10 ГБ1), сохраняются между запросами и доступны только в пределах этого объекта.
Однопоточный параллелизм
- Каждый экземпляр Durable Object имеет идентификатор, сгенерированный либо случайным образом, либо пользователем, который позволяет глобально адресовать Durable Object, отвечающий за конкретное действие или запрос.
- Durable Objects однопоточны и используют кооперативную многозадачность, как и код, выполняющийся в веб-браузере. Подробнее о том, как обеспечиваются безопасность и корректность, см. статью в блоге "Durable Objects: Easy, Fast, Correct, Choose three" ↗.
Эластичное горизонтальное масштабирование в глобальной сети Cloudflare
- Durable Objects могут быть распределены по всему миру, и вы можете при желании влиять на то, где должен размещаться каждый экземпляр. Durable Objects пока доступны не во всех дата-центрах Cloudflare; подробнее см. where.durableobjects.live ↗ проект с данными о текущих местоположениях.
- Каждый тип Durable Object (или «Namespace binding» в терминологии Cloudflare) соответствует классу JavaScript, реализующему саму логику. Жёсткого ограничения на количество Durable Object, которые можно создать для каждого пространства имён, не существует.
- Durable Objects эластично масштабируются по мере того, как приложение создаёт миллионы объектов. Приложениям не нужно управлять инфраструктурой или заранее планировать ёмкость.
Возможности Durable Objects
Состояние в памяти
Каждый Durable Object имеет своё состояние в памяти. Приложения могут использовать это состояние в памяти для повышения производительности, храня важные данные прямо в памяти и полностью избегая обращений к постоянному хранилищу.
Состояние в памяти удобно использовать, например, для группировки и агрегирования данных перед их сохранением в хранилище, а также для немедленного отклонения или обработки входящих запросов, соответствующих определенным критериям, и в других подобных случаях.
Состояние в памяти сбрасывается, когда Durable Object переходит в спящий режим после периода бездействия. Поэтому важно сохранять данные из памяти в постоянное хранилище, если они могут понадобиться позже, когда Durable Object получит следующий запрос.
Storage API
Durable Object Storage API предоставляет Durable Objects доступ к быстрому, транзакционному и строго консистентному хранилищу. Хранилище, привязанное к Durable Object, доступно только его собственному экземпляру и недоступно другим объектам.
Существует два варианта storage API: API ключ-значение (KV) и SQL API.
При использовании новый бэкенд хранилища SQLite в Durable Objects, у вас есть доступ к обоим API. Однако при использовании прежнего бэкенда хранилища вам доступен только key-value API.
Alarms API
Durable Objects предоставляют Alarms API что позволяет запланировать пробуждение Durable Object в определённый момент в будущем. Это удобно, если вы хотите выполнять определённую работу периодически или в конкретный момент времени, не управляя вручную такой инфраструктурой, как собственные раннеры планирования заданий.
Вы можете сочетать Alarms с состоянием в памяти и API долговременного хранилища для создания пакетных и агрегирующих приложений, таких как очереди, workflows или сложные конвейеры обработки данных.
WebSockets
WebSocket представляют собой долгоживущие TCP-соединения, которые обеспечивают двустороннюю связь в реальном времени между клиентом и сервером. Поскольку сессии WebSocket долгоживущие, приложения часто используют Durable Objects для приема клиентского или серверного подключения.
Durable Objects служат единой точкой координации между Cloudflare Workers, поэтому один экземпляр Durable Object можно использовать вместе с WebSocket для координации нескольких клиентов, например участников чата или многопользовательской игры.
Durable Objects поддерживают Стандартный API WebSocket, а также WebSockets Hibernation API который расширяет стандартный веб-API WebSocket, снижая расходы за счет отсутствия платы за периоды неактивности.
RPC
Durable Objects поддерживают Workers Удалённый вызов процедур (RPC) что позволяет приложениям использовать нативные методы и объекты JavaScript для обмена данными между Workers и Durable Objects.
Использование RPC для взаимодействия упрощает разработку приложений, делает её более понятной и эффективной.
Акторная модель программирования
Ещё один способ описать Durable Objects и понять принцип их работы заключается в том, чтобы взглянуть на них через призму Акторная модель программирования ↗. Есть несколько известных примеров модели Actor, поддерживаемой на уровне языка программирования через runtime или библиотечные фреймворки, например Erlang ↗, Elixir ↗, Akka ↗, или Microsoft Orleans для .NET ↗.
Модель акторов существенно упрощает многие проблемы распределённых систем, абстрагируя взаимодействие между акторами через вызовы RPC (или обмен сообщениями), которые можно реализовать поверх любого транспортного протокола. Благодаря этому она позволяет избежать большинства проблем параллелизма, возникающих при работе с общей памятью, таких как гонки данных, когда несколько процессов или потоков одновременно обращаются к одним и тем же данным в памяти.
Каждый экземпляр Durable Object можно рассматривать как экземпляр модели Actor: он получает сообщения (входящие HTTP или RPC запросы), выполняет некоторую логику в своём однопоточном контексте, используя подключённое устойчивое хранилище или состояние в памяти, а затем отправляет сообщения во внешний мир (исходящие HTTP или RPC запросы либо ответы), в том числе другому экземпляру Durable Object.
Каждый Durable Object обладает определёнными возможностями с точки зрения того, сколько работы он может выполнить, что должно влиять на архитектуру для полноценного использования платформы.
Durable Objects нативно интегрированы в инфраструктуру Cloudflare и дают вам serverless платформу для создания распределённых stateful приложений с использованием всей сети Cloudflare.
Durable Objects в Cloudflare
Многие продукты Cloudflare используют Durable Objects. В некоторых технических статьях нашего блога показаны реальные примеры и сценарии использования, в которых Durable Objects упрощают разработку приложений.
Эти статьи в блоге также могут подсказать, как проектировать масштабируемые приложения на основе Durable Objects и как интегрировать их с остальной частью Cloudflare Developer Platform.
- Durable Objects не просто надёжны, они быстры: ускорение Cloudflare Queues в 10 раз ↗
- Как устроен Stream Live, сервис живых трансляций от Cloudflare ↗
- DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway ↗
- Workers Builds: интегрированный CI/CD на платформе Workers ↗
- Создавайте устойчивые приложения на Cloudflare Workers: вы пишете Workflows, а всё остальное берём на себя мы ↗
- Создание D1: глобальная база данных ↗
- Миллиарды и миллиарды логов: как AI Gateway масштабируется на Cloudflare Developer Platform ↗
- Индексирование миллионов HTTP-запросов с помощью Durable Objects ↗
Наконец, следующие статьи в блоге помогут вам разобраться в некоторых технических аспектах реализации Durable Objects и в том, как они работают.
- Durable Objects: просто, быстро, правильно. Выбирайте все три. ↗
- Хранилище SQLite с нулевой задержкой в каждом Durable Object ↗
- Workers Durable Objects Beta: A New Approach to Stateful Serverless ↗
Начало работы
Начните прямо сейчас, воспользовавшись руководство «Get started» чтобы создать первое приложение с использованием Durable Objects.
Сноски
-
В настоящее время хранилище на один Durable Object с SQLite составляет 1 GB. После перехода в общий доступ это значение будет увеличено до 10 GB. ↩