Представьте себе мир, где ваши приложения синхронизируют только то, что действительно нужно, и делают это не сразу, а ровно в тот момент, когда это необходимо. Звучит как фантастика? На самом деле, это уже реальность, и она называется Graft.
Graft – это новый open-source движок для репликации данных, созданный Карлом Сверре (Carl Sverre). Он сочетает в себе простоту физической репликации и гибкость логической, решая извечную проблему частичной и ленивой синхронизации. Давайте разберёмся подробнее, почему этот подход может стать революционным.
🌱 Почему традиционные подходы устарели?
Долгое время перед разработчиками стоял выбор:
- 📦 Полная репликация: отправляем всё всем и всегда. Это просто, но слишком дорого, особенно на мобильных устройствах, браузерах или серверных функциях.
- 🔍 Логическая репликация (CDC, CRDT): отправляем лишь изменения отдельных строк и полей. Это эффективно, но сложно интегрировать и поддерживать на произвольных данных.
Graft предлагает третий путь: он не знает ничего о данных, он просто отправляет страницы байтов, но при этом чётко знает, какие именно страницы изменились. В итоге клиент всегда контролирует, что и когда ему нужно.
🧩 Чем уникален подход Graft?
Главная особенность Graft — это комбинация нескольких мощных свойств:
- 🐢 Lazy-репликация: клиент решает сам, когда подтягивать изменения. Нет больше постоянного фонового шума. Есть только точечные запросы, когда это действительно нужно.
- 🎯 Частичная репликация: скачиваются только страницы данных, которые реально используются. Если приложение использует всего несколько строк из огромной базы данных, оно подтянет лишь эти страницы.
- 📍 Edge-ориентированность: Graft предназначен специально для работы на периферийных устройствах (мобильные приложения, браузеры, IoT). Данные всегда ближе к пользователю.
- 🔒 Строгая согласованность: используется модель Serializable Snapshot Isolation, гарантирующая, что данные всегда будут согласованы и корректны, даже при одновременных изменениях на множестве устройств.
⚙️ Как это работает технически?
В основе Graft лежат Volumes (тома), состоящие из страниц данных. Изменения объединяются в компактные наборы метаданных — Graft (отсюда и название проекта). Клиент получает этот «графт», чтобы понять, какие страницы устарели, а затем уже решает, какие именно страницы нужно подтянуть.
Здесь и появляется важная технологическая деталь — формат Splinter, основанный на Roaring Bitmaps. Это компактные битовые карты, которые можно читать напрямую из памяти или сетевых буферов без дополнительного копирования, что критически важно для Edge-устройств с ограниченными ресурсами.
🚦 Как решаются конфликты?
Любая синхронизация сталкивается с конфликтами: что делать, если два устройства одновременно меняют одни и те же данные? Graft решает эту проблему элегантно:
- ⚠️ Клиент пытается сохранить данные, но если его версия уже устарела, сервер отклоняет изменения.
- 🔄 Клиент автоматически подтягивает последнюю версию и решает, как быть дальше:
🛠️ Перезапускает транзакцию (перезапись).
🔀 Объединяет изменения (merge).
🌳 Создаёт отдельный «форк» тома с независимым состоянием.
Таким образом, система всегда сохраняет глобальную согласованность, не жертвуя удобством для конечного пользователя.
📱 Что можно создать с помощью Graft?
Возможности применения Graft очень широки:
- 📒 Офлайн-приложения: заметки, списки задач, планировщики, которые работают идеально даже без сети.
- 🔄 Кросс-платформенные сервисы: данные легко путешествуют между мобильными приложениями, веб-браузерами и даже IoT-устройствами.
- 📡 Стейтлесс-реплики: реплики данных, которые запускаются мгновенно без предварительного скачивания всей базы.
- 📂 Произвольные данные: помимо баз данных, Graft можно использовать для синхронизации фотографий, ИИ-моделей, бинарных файлов и даже нестандартных форматов данных.
Сам автор Карл Сверре в шутку призывает использовать Graft даже в самых неожиданных местах: в зубной щётке с интернетом или на PlayStation 2. И это не просто шутка: архитектура позволяет внедрить Graft куда угодно!
📚 Как уже сейчас попробовать Graft?
Для разработчиков уже доступен libgraft — расширение для SQLite, реализованное через виртуальную файловую систему (VFS). Оно обеспечивает ленивую и частичную репликацию прямо внутри SQLite-базы, идеально подходит для мобильных устройств и браузеров.
Кроме того, планируется запуск управляемого облачного сервиса Graft Managed Service, к которому можно присоединиться уже сейчас, зарегистрировавшись в листе ожидания.
🗣️ Мнение автора статьи:
Подход, предложенный Карлом Сверре, кажется именно тем решением, которого давно не хватало разработчикам, уставшим выбирать между громоздкостью полной репликации и сложностью логической. На мой взгляд, Graft способен стать стандартом для новых поколений приложений, работающих с данными. Особенно интересно наблюдать за тем, как такие технологии находят применение в реальной жизни — от мобильных игр до высоконагруженных IoT-систем. Этот проект явно заслуживает внимания сообщества.
🔗 Источник: Stop Syncing Everything - sqlsync.dev
📖 Полезные ссылки из статьи: