База данных, всегда способная читать или записывать информацию: Локальный магазин Ditto

Если вы еще не знакомы с Ditto, мы представляем собой базу данных реального времени для мобильных, веб-, IoT и серверных приложений, которая может волшебным образом синхронизировать данные с интернетом или даже без него.

Но что действительно интересно в нашей базе данных, так это то, что вы можете использовать Ditto в своих приложениях как обычную базу данных документов. Когда мы только создали Ditto, мы пошли по трем параллельным путям создания всей нашей системы:

  1. Часть базы данных: основной способ, которым клиенты используют Ditto сегодня.
  2. Репликация и CRDT: как клиенты могут распределенно изменять данные и автоматически разрешать конфликты.
  3. Ячеистая сеть: как устройства могут гетерогенно общаться друг с другом.

Части 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 в ближайшие месяцы, так что следите за новостями!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *