Синхронизация основных данных через Parse

Я заинтересован в разработке библиотеки, которая будет синхронизировать базовую модель данных между устройствами через мобильный сервер Parse. Я хочу отразить функциональность, которую пытается обеспечить синхронизация основных данных iCloud.

Почему бы не использовать iCloud или ансамбли? В настоящее время я использую синхронизацию основных данных iCloud в производственном приложении, и это у меня не работает. Я также хочу обеспечить аутентификацию независимо от Apple ID, что является еще одной причиной, по которой я хочу уйти от iCloud. Что касается Ensembles, я не уверен, что это все еще будет работать с Dropbox из-за устаревание API синхронизации Dropbox.

Я не начал разрабатывать библиотеку. Я ищу отзывы о моем плане, который изложен ниже. Этот дизайн основан на этом ответе SO.

Общий план библиотеки:

  1. Библиотека будет предоставлять стандартный базовый стек данных, который установит координатора постоянного хранилища и контекст управляемого объекта. Все стандартные основные операции CRUD с данными будут выполняться через интерфейс, предоставляемый библиотекой.

  2. Каждый раз, когда выполняется операция CUD, объект операции синхронизации будет сохраняться в Parse в фоновом режиме, включая всю информацию, необходимую для воспроизведения операции. Это включает в себя: тип выполненной операции, уникальный идентификатор объекта, над которым была произведена операция, а в случае операции создания будут предоставлены родительский объект и связь.

  3. Каждая операция будет иметь связанный с ней номер change_id. Каждый раз, когда устройство загружает и выполняет операцию, оно сохраняет последний change_id, связанный с этой операцией.
  4. Перед загрузкой каждой операции синхронизации устройство отправляет запрос на сервер, чтобы убедиться, что сохраненный номер change_id соответствует номеру, хранящемуся локально. Если  change_id на сервере выше, он сначала загрузит все операции синхронизации и выполнит их, а затем загрузит свои собственные операции синхронизации.
  5. Конфликты (два устройства, редактирующие одно и то же значение в автономном режиме) будут разрешаться путем определения того, какое устройство изменило значение последним.

Я что-то пропустил здесь? Какие потенциальные подводные камни могут быть при таком подходе? Я слышал, что синхронизация сложна, следует ли оставить это дело самым опытным разработчикам?


person ChemDev    schedule 08.07.2015    source источник


Ответы (1)


Я не самый предвзятый ответчик, потому что я разработчик среды Ensembles, но позвольте мне высказать некоторые мысли.

Что касается самого Ensembles, то это фреймворк, не зависящий от бэкенда. Да, он работает с iCloud и Dropbox Sync API, а также с CloudKit, Dropbox Core API (который не устарел) и WebDAV. Существует также собственный сервер Node.js, доступный с одним пакетом, который позволяет вам самостоятельно размещать данные с помощью Heroku и S3.

Так что даже если вы не хотите оставаться с Apple, есть и другие варианты. Но даже более того, вы можете написать свой собственный класс внутреннего адаптера. Большинство из них содержат около 500 строк кода, и вы можете создать его на основе одного из существующих классов. Это позволит вам создать серверную часть, которая хранит данные и аутентифицируется с помощью Parse, а слияние данных оставить Ensembles. Еще одним преимуществом этого является то, что вы можете легко перейти на другие серверные части в будущем или предложить их в качестве опций. (CloudKit определенно стоит посмотреть.)

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

Вместо того, чтобы выполнять операции CRUD через интерфейс, вы можете просто наблюдать за NSManagedObjectContextDidSaveNotification и извлекать изменения из словаря userInfo.

Я уверен, что вы найдете много мелочей, о которых вы не подумали, и именно эти детали, как правило, затрудняют синхронизацию. Одним из таких примеров является то, что вам нужно создать что-то достаточно надежное, чтобы обрабатывать сбои, такие как операции синтаксического анализа, которые не завершаются до завершения работы приложения. Вероятно, вам нужно иметь тег изменения для каждого объекта, чтобы вы могли получить те, которые изменились с момента последней синхронизации.

Если в вашем приложении есть небольшой объем данных, создание этой системы не представляет особой сложности, но по мере того, как ваши данные начинают расти, вам нужно начать использовать такие вещи, как пакетная обработка, чтобы поддерживать низкий уровень данных в памяти на iOS. Такие вещи могут занять много времени. Например, Ensembles 2 имеет почти такой же API, что и Ensembles 1, но я потратил около 4 месяцев на то, чтобы переписать такие вещи, как пакетная обработка, для эффективного использования памяти.

Я создал прототип приложения, используя описанный вами подход (приложение было социальным, а не синхронизированным, следовательно, без ансамблей). Я использовал CloudKit, который очень похож на Parse. Потребовалось около 1000 строк кода Swift, чтобы все загрузка/выгрузка данных работала нормально с локальным кешем Core Data. Это, безусловно, выполнимо, особенно если вы уже хорошо знакомы с Core Data. В противном случае может возникнуть кривая обучения.

Я поддерживаю такой фреймворк, как Ensembles, просто потому, что в нем уже решены многие мелкие детали, которые вам нужно решить, и он не привязывает вас к определенному бэкенду. Если Parse решит поднять свои сборы, вы сможете свободно переехать в другое место.

person Drew McCormack    schedule 09.07.2015
comment
Дрю, большое спасибо, что нашли время дать подробный и вдумчивый ответ на мой вопрос! Приятно слышать от кого-то, кто действительно успешно разработал библиотеку синхронизации. Ансамбли кажутся интересным вариантом, однако я склоняюсь к разработке собственной библиотеки, потому что ее будет легче адаптировать к моим потребностям и требованиям. С учетом сказанного, если бы у вас было готовое решение, использующее Parse в качестве серверной части и не требующее большого количества пользовательского кода, я бы определенно купил его по вашей текущей цене. Если я так думаю, то должны быть и другие, которые тоже так думают :) - person ChemDev; 20.07.2015
comment
Возможно, для вас уже слишком поздно, но я посмотрю на добавление бэкэнда parse.com. - person Drew McCormack; 21.07.2015
comment
@ChemDev Я говорю как человек, который очень хорошо разбирается в Core Data, а также разработал собственное решение для синхронизации ... а затем понял, что не сделал его таким общим, как хотел, когда у меня был проект, который нужно было используйте S3 в качестве резервного хранилища. Я был так впечатлен Ensembles, что заплатил за версию 2, и это были лучшие деньги, которые я потратил за последние годы. У вас есть доступ к исходному коду, поэтому вы можете изменять и адаптировать его по своему усмотрению, но вам, вероятно, нужно только написать бэкэнд-плагины, что я и сделал, и теперь мое приложение для OS X изначально синхронизируется непосредственно с AWS S3 (с несколько пользователей). - person Jody Hagins; 22.07.2015
comment
Джоди спасибо за комментарий, я собираюсь дать ансамбли и отчитаюсь. - person ChemDev; 22.07.2015
comment
Дрю, многопользовательская синхронизация интригует. Как это обрабатывается с помощью cloudkit с точки зрения аутентификации пользователей, совместно использующих ансамбль? Это функция, доступная из коробки, или требуется специальный код? - person ChemDev; 23.07.2015
comment
Сам Ensembles этим не занимается. Существует так много способов сделать многопользовательский режим, что это будет проблемой. Так что это остается за вами. Например, вы можете создать группу пользователей, которые совместно используют определенный каталог Ensemble в облаке. Управление пользователями остается в качестве упражнения для разработчика. - person Drew McCormack; 23.07.2015