DataSync API від Яндекса.Диска: хмара для додатків і структурованих даних

Для синхронізації даних в додатках не підходять звичайні файлові» хмарні сховища. Занадто багато проблем з консистентностью даних доводиться вирішувати самим авторам додатків. Тому сьогодні ми відкриваємо всім бажаючим технологію DataSync API, яку команда Яндекс.Диска розробляла для власних сервісів Яндекса. Вона дозволяє синхронізувати структуровані дані між хмарним сховищем і пристроями. API використовує логін Яндекса, який є майже у кожного користувача інтернету в Росії і в багатьох інших країнах. DataSync мультиплатформовий і не зав'язаний тільки на Android або iOS.



Ми правда дуже раді, адже ще три роки тому, коли запускався Яндекс.Диск, хотіли синхронізувати не лише файли між комп'ютерами, а взагалі будь-які дані між всіма пристроями людини. Наша цифрова життя — це не тільки файли, але ще і точки на картах, маршрути, закладки в браузері, список рекордів у комп'ютерній грі і багато іншого.

Вже більше двох років Яндекс.Браузер працює на технології синхронізації Я. Диска. У найближчому майбутньому інші великі сервіси Яндекса почнуть об'єднувати свої платформи на DataSync. Під катом — більше подробиць про те, як він влаштований, навіщо потрібен, і приклади, на яких можна подивитися і спробувати, як все працює.

Коли-то базовим інфраструктурним елементом інтернету став веб-сервер, без якого неможливо уявити існування всесвітньої мережі. Тепер часи змінилися, і ми впевнені, що хмарна самосинхронизирующаяся база даних буде не менш важливим елементом сучасного мультиплатформного інтернету.

Раніше у користувача було лише одне пристрій і тільки один спосіб взаємодіяти з інтернет-сервісом — піти на сайт. І для розробника все було просто. База-Код-Веб-інтерфейс. Десь у надрах сайту працювала база даних, де розробник зберігав потрібні йому дані, і звідки їх забирав, відображаючи на одному пристрої, а точніше — в браузері його комп'ютера.

Однак часи сильно змінилися, і тепер у людини може бути безліч пристроїв, а один сервіс може бути представлений цілим набором додатків. Це сильно ускладнило життя розробника. У нього всього стало більше: інтерфейсів, баз, логіки і навіть мов програмування. Але найжахливіше — це дані. На будь-яких пристроях є локальні копії даних, які живуть на сервері і інших пристроях, і їх всі необхідно синхронізувати між собою. Це зовсім не просте завдання: можливі конфлікти, втрата даних, втрата зв'язку, потрібна нормальна швидкість роботи на всіх пристроях — і багато іншого.

Очевидно, що якщо розробник кожен раз буде сам вирішувати з нуля завдання синхронізації додатків і хмарного зберігання даних, він, швидше за все, забуде, що він власне збирався зробити спочатку або добереться до цього зовсім не скоро.

Звичайно ж, завдання вирішити описувану проблему з'явилася і в Яндексі. Ми почали працювати над створенням «хмарної бази даних», яка звільнить розробку від рутинної завдання синхронізації і дозволить сфокусуватися на створенні додатків.

Звичайна база даних нудно живе на одному комп'ютері, а ми робили базу, яка живе одночасно в хмарі і на всіх пристроях користувача. Це, зрозуміло, як готове рішення, принципово спрощує завдання розробки мультиплатформових додатків. Де б не були збережені дані в таку базу — на телефоні, в браузері, на сервері, — нічого не загубиться і скрізь з'являться актуальні дані.

У внутрішній документації на проект написано так: «DataSync API — це сховище довільних структурованих даних, прив'язаних до користувача або на парі користувач + додаток. Воно розраховане на можливість синхронізації між користувацькими пристроями і нормальну роботу в умовах поганої мобільної мережі».

Для зовнішнього розробника наша база даних дуже схожа на популярну noSQL базу MongoDB — суть та сама. Вона складається з колекцій, колекції — з об'єктів. Об'єкт — це набір key-value полів. Але ми поставили перед собою завдання зробити так, щоб розробник не думав про те, як йому зв'язувати дані на різних пристроях і в хмарі, а просто працював з нашим API, в той час як вся синхронізація даних відбувалася магічним чином. Звичайно ж, така «магія» можлива, коли ви використовуєте, і хмара, і клієнтську частину нашого «синхронізуючого» SDK.

І тут хочеться трохи детальніше розповісти, які проблеми і як ми вирішували, щоб вона трапилася.

Конфлікти
В запропонованому пристрої світу у нас багато екземплярів бази, і всі вони змінюються локально. У такій ситуації неминуче поява конфліктів, коли дані змінюються одночасно в різних місцях. А втрачати дані зовсім не хочеться. Алгоритм вирішення цієї проблеми досить традиційний:

  • у всіх примірників даних з'являється версія, про яку знає кожен пристрій і сервер;
  • при відправці змін вона відсилається і перевіряється на сервері;
  • у разі розбіжностей версій клієнт отримує список змін, про які він не знав, і може правильно вирішити конфлікт.
Прозора робота без мережі
Мобільний додаток (та багато інших) не може розраховувати на стабільний зв'язок, а дані сервісу можуть змінитися в будь-який момент. Це не повинно бути проблемою для того, хто використовує нашу хмарну базу. Очевидно це так само дуже важливо враховувати в нашому SDK. Ми вирішили цю проблему такою схемою дій:

  • все спілкування з сервером на себе бере наше SDK;
  • спілкування з сервером повністю асинхронно і відбувається на тлі;
  • методи, які SDK являє розробникам, ніколи не чекають закінчення читання/запису з мережі.
В документації DataSync API описані всі методи, які використовують наші власні SDK. Вам нічого не варто зробити власну захищену від конфліктів і обривів зв'язку бібліотеку для будь-якої платформи.

Ми спочатку зробили так, що кожне «додаток» синхронізується з таким же на інших платформах і на сервері. Але потім знайшлися приклади, коли важливо синхронізувати дані між різними програмами на одному пристрої — грубо кажучи, мати загальну базу даних. І тоді ми реалізували і таке. Тепер, наприклад, якщо у вас є lite-додаток і повноцінне, то ви без праці зможете прокинути дані користувача, який зважився на апгрейд, з одного в інше. Або відправити або отримати дані з додатка партнера.

Як влаштований API
У процесі роботи з API клієнт в основному оперує такими поняттями, як:
  • база даних (БД),
  • дельта оновлення,
  • снепшот,
  • конфлікт.
БД є одиницею синхронізації для API. Вона містить у собі об'єкти (записи), об'єднані в колекції. Але всі операції по суті справи виробляються з окремими об'єктами. При цьому щоб однозначно ідентифікувати об'єкт, необхідно вказати ідентифікатор і його колекції.

Ідентифікатором стану БД є номер ревізії. В API реалізована схема контролю ревізій, що дозволяє відслідковувати та фіксувати конфліктні ситуації. При створенні БД ревізія дорівнює нулю, при подальшому отриманні будь-яких змін для даної бази номер ревізії буде збільшуватися на одиницю. Будь-які зміни здійснюються за рахунок відправки дельти оновлень. З її допомогою можна створювати, видаляти і редагувати записи.

Конфліктом вважається така ситуація, при якій клієнт відправляє на сервер ревізію молодше існуючої на ньому. В такому випадку сервер дивиться на номер прийшов ревізії та надсилає набір змін до існуючої версії.



У разі, коли ревізія на клієнта настільки застаріла, що сервер не може надати список необхідних змін, клієнту необхідно отримати снепшот бази і оновитися до поточної ревізії самостійно. Схема вирішення конфліктів залишається на розсуд розробників.

Снепшот бази відображає стан актуальною ревізії бази на сервері. Його необхідно запитувати при створенні локальної БД на пристрої або при вирішенні конфліктних ситуацій.

Для того щоб розшарювати дані тільки в рамках власної програми необхідно запитувати права на доступ зберігання даних програми, для розшарювання даних — доступ до загальних даних користувача.

Висновок
Почати використовувати HTTP API і JS SDK ви можете вже зараз. У найближчому майбутньому ми випустимо SDK для Android і iOS.

Подивитися, як все працює, можна на прикладі адресної книги в тестовому браузерном додатку. Воно демонструє, як може відбуватися синхронізація телефонних номерів користувача з кроком в 20 секунд. Дані синхронізуються з хмарою і будь примірником веб-додатки. Найпростіший спосіб перевірити це — відкрити дві вкладки в браузері.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.