Rivet — открытая альтернатива Durable Objects для stateful-приложений
Когда вам в последний раз приходилось писать сложную логику для поддержания состояния между запросами в serverless-архитектуре? Рискну предположить, что это было не так давно. Именно эту проблему решает Rivet — open-source проект, который делает работу с долгоживущими процессами такой же простой, как и с обычными функциями.
Что такое Rivet и кому он нужен?
Rivet позиционирует себя как альтернативу Cloudflare Durable Objects, но с открытым исходным кодом и возможностью самоличного хостинга. Основная идея — предоставить разработчикам инструмент для создания stateful-приложений, которые:
- Сохраняют состояние между вызовами
- Масштабируются автоматически
- Поддерживают real-time взаимодействие
- Работают с минимальной задержкой
Проект особенно полезен для:
- Разработчиков multiplayer-игр
- Создателей чат-приложений
- Инженеров, работающих с collaborative editing (например, Google Docs-подобные редакторы)
- Разработчиков систем реального времени (IoT, биржевые тикеры и т.д.)
Ключевые возможности Rivet
1. Долгоживущие процессы с сохранением состояния
В отличие от традиционных serverless-функций, которые "забывают" свое состояние между вызовами, Rivet Actors сохраняют его в памяти и на диске. Это как если бы ваш AWS Lambda мог помнить данные между вызовами без необходимости каждый раз обращаться к внешней базе данных.
2. Встроенная поддержка real-time
Rivet из коробки предоставляет WebSockets и Server-Sent Events (SSE), что делает его идеальным выбором для приложений, требующих мгновенного обновления данных. Больше не нужно поднимать отдельные сервисы для real-time функциональности.
3. Автомасштабирование без головной боли
Система автоматически масштабируется от нуля до миллионов запросов без необходимости ручной настройки. При этом сохраняется локальность данных — состояние хранится на той же машине, где выполняется код, что обеспечивает минимальные задержки.
4. Отказоустойчивость
Rivet автоматически обрабатывает ошибки и восстанавливает состояние после сбоев. Ваши процессы не пропадут, даже если что-то пойдет не так.
Технические детали
Под капотом Rivet использует:
- Rust для ядра системы (обеспечивает высокую производительность)
- FoundationDB для хранения состояния
- NATS для pub/sub взаимодействия
- Valkey (форк Redis) для кэширования
- ClickHouse для мониторинга
Архитектура состоит из нескольких ключевых компонентов:
- Pegboard — оркестратор акторов
- Guard — прокси для маршрутизации трафика
- Chirp — workflow-движок
Практическое применение: где Rivet действительно сияет
В репозитории есть несколько отличных примеров:
- Чат-комната — классический пример real-time приложения
- Мультиплеерная игра — демонстрирует синхронизацию состояния между игроками
- Совместное редактирование документов на базе Yjs (CRDT)
- AI-агент с сохранением контекста между запросами
Особенно впечатляет пример с локальной синхронизацией данных — он показывает, как Rivet может использоваться для создания offline-first приложений с последующей синхронизацией при появлении соединения.
Стоит ли попробовать?
Если вы:
- Устали от сложностей с поддержанием состояния в serverless-архитектуре
- Разрабатываете real-time приложения
- Хотите иметь контроль над инфраструктурой (возможность самоличного хостинга)
- Работаете над проектами, где важна низкая задержка
— то Rivet определенно заслуживает вашего внимания.
Проект активно развивается (на момент написания статьи у него уже 4.2k звезд на GitHub) и имеет активное сообщество в Discord. Для начала работы можно использовать RivetKit — легковесную TypeScript-библиотеку, которая работает как с Redis, так и с полной версией Rivet Engine.
Ссылки для старта:
P.S. Лично мне особенно нравится, как Rivet сочетает мощь enterprise-решений с простотой разработки. Это редкий случай, когда сложные distributed-системы становятся доступными для обычных разработчиков.