Если вы еще не знакомы с Ditto, мы представляем собой базу данных реального времени для мобильных, веб-, IoT и серверных приложений, которая может волшебным образом синхронизировать данные с интернетом или даже без него.
Но что действительно интересно в нашей базе данных, так это то, что вы можете использовать Ditto в своих приложениях как обычную базу данных документов. Когда мы только создали Ditto, мы пошли по трем параллельным путям создания всей нашей системы:
- Часть базы данных: основной способ, которым клиенты используют Ditto сегодня.
- Репликация и CRDT: как клиенты могут распределенно изменять данные и автоматически разрешать конфликты.
- Ячеистая сеть: как устройства могут гетерогенно общаться друг с другом.
Части 2 и 3 работают, только если вы вызовете ditto.tryStartSync()
. Однако мы хотели создать систему, в которой часть базы данных всегда была бы способна читать или записывать информацию. Это означает, что если ваше приложение никогда не устанавливает никаких разрешений сетевой конфигурации или не вызывает ditto.tryStartSync()
, экземпляр будет работать только как локальная база данных.
Использование невероятно простое. Вот пример с использованием Swift
val ditto = Ditto()
// inserting a document
ditto.store["people"].upsert([
"name": "Alice",
"score": 21
])
// finding documents
let docs = ditto.store["people"].find('name == $args.name', [
"name": "Alice"
])
и на Android
val ditto = Ditto(androidDependencies)
// inserting a document
ditto.store["people"].upsert(
mapOf(
"name" to "Alice",
"score" to 21
)
)
// finding documents
val docs = ditto.store["people"].find('name == $args.name', mapOf(
"name" to "Alice"
))
Для получения дополнительной информации о наших API и других поддерживаемых языках программирования ознакомьтесь с разделом «Концепции» нашей документации. Все операции с данными store
будут работать точно так же, как и в синхронизированном экземпляре Ditto. Это означает, что ваше приложение полностью способно выполнять запросы в реальном времени и на локальном экземпляре Ditto.
let ditto = Ditto()
let liveQueries = ditto.store["cars"].findAll().observe({ documents in
updateUI(documents)
})
Использование преимуществ только локального экземпляра Ditto в том же приложении, что и синхронизируемый экземпляр Ditto
Каждый экземпляр Ditto является автономным. Это означает, что в приложении может одновременно работать несколько экземпляров ditto. Все, что вам нужно сделать, это проявить некоторую осторожность
// constructing a local only instance
let dittoLocalOnly = Ditto(path: '/foo1')
// constructing a syncing version of Ditto
let dittoSyncing = Ditto(identity: .onlinePlayground(appID: "my-cool-app"), path: '/foo2')
try! dittoSyncing.tryStartSync()
// notice that the path values are different to ensure that there are no file system collisions.
Зачем вам синхронизирующий и несинхронизирующий экземпляры в одном приложении? Причин может быть много. Возможно, вашему приложению нужно просто хранить данные локально без репликации, используя привычный интерфейс обычного экземпляра Ditto, и в то же время требуется синхронизировать другой экземпляр. Синхронизация экземпляров Ditto позволяет контролировать определенные данные, которые синхронизируются или не синхронизируются между устройствами, но некоторые пользователи могут захотеть упростить управление несколькими экземплярами Ditto с различными функциональными возможностями.
Заглядывая в будущее
Ditto — это комплексный платформенный продукт, который может синхронизировать данные независимо от подключения от границы до облака. С учетом этого, это действительно наш хлеб с маслом, поэтому большая часть наших инженерных усилий сосредоточена на производительности репликации, сети mesh и нашего Big Peer (который живет в облаке). Это означает, что многие функции сравнимых баз данных не дотягивают до уровня, скажем, SQLite или Realm. Но не волнуйтесь, мы определенно к этому идем!
Чего нам не хватает сейчас?
- Отсутствие индексации — В настоящее время у нас нет функциональности для индексации данных. Не волнуйтесь, мы разрабатываем эту функциональность прямо сейчас.
- Сериализация без CRDT — Помните, мы создали синхронизирующую базу данных, поэтому каждый документ представляет собой полностью компонуемый вложенный CRDT. Даже если вы используете ее как локальную базу данных, мы все равно создаем и сериализуем CRDT на диск.
Что насчет JavaScript?
В настоящее время использование Ditto в качестве локальной базы данных с помощью нашего JavaScript SDK сопряжено с некоторыми оговорками. Наш веб-опыт в настоящее время работает только в памяти. Это означает, что если вы используете npm-пакет @dittolive/ditto
в веб-браузере, ваш пакет будет использовать нашу версию WebAssembly. В результате в хранилище ничего не сохраняется, и при простом обновлении веб-страницы все данные будут удалены. Мы активно работаем над интерфейсом резервного хранилища с использованием API доступа к файловой системе для современных браузеров и над откатом к IndexedDB в этом году.
Хорошей новостью является то, что сегодня вы можете получить персистентность, если используете нашу JS-библиотеку в Electron или NodeJS. Если вам интересно, почему: в отличие от браузера, эти платформы на самом деле имеют нативный доступ к API. Таким образом, при запуске Ditto в среде NodeJS или Electron пакет NPM будет использовать скомпилированную нативную библиотеку в качестве резервного слоя хранения, и вы увидите, как создаются файлы Ditto!
Реальное приложение, использующее Ditto в качестве локальной базы данных — Vaxx
Мы хотели проверить, как можно использовать Ditto в качестве локальной базы данных в приложении, которое действительно может быть полезным для всего мира. Поскольку некоторые города обязали рестораны проверять наличие записей о прививках, чтобы получить обслуживание, мы заметили, что многие клиенты бесконечно прокручивали свои телефоны, чтобы найти фотографию своих записей. Это отнимало много времени у метрдотеля и замедляло процесс обслуживания. Поэтому мы подумали, что если бы мы могли создать приложение с простым (и в то же время модным) названием, которое позволило бы клиентам сразу же достать свою карту прививок? С Ditto это на самом деле очень просто. Мы создали его всего за 1 день и выпустили в магазин приложений! Vaxx работает на Ditto, используя его только как локальную базу данных, и вообще ничего не синхронизирует. В настоящее время Vaxx пользуется 55 000 активных пользователей без всякой рекламы и продолжает расти! Кроме того, если вы просто выполните поиск «Vaccine Card» в американском Apple App Store, это будет первый результат.
- Скачать Vaxx для iOS можно здесь
- Посмотрите исходный код на GitHub
Мы надеемся создать версию для Android в ближайшие месяцы, так что следите за новостями!