Подтвердить что ты не робот

Стратегии синхронизации данных с сервером в PhoneGap

Я начинаю свой первый проект PhoneGap, используя AngularJS. Это приложение, управляемое базой данных, с использованием REST API в качестве бэкэнд. Начнем с того, что я не собираюсь хранить данные локально вообще, поэтому он не будет работать без Интернета.

Однако в конечном итоге мне захочется, чтобы он хранили данные на локальном компьютере и синхронизировался, когда доступен Интернет, поскольку я знаю, что я лично время от времени отключаю подключения к Интернету на своем телефоне (воздушные самолеты, батарея с низким уровнем заряда) или не имеет баров. Мне было интересно, можете ли вы указать мне на некоторые хорошие ресурсы для такого типа синхронизации. Некоторые рекомендуемые библиотеки? Или, возможно, некоторые дискуссии о подводных камнях и о том, как их крутить вокруг. Я немного искал Google, но думаю, что сейчас, я не знаю вопросов, которые нужно задать.

Кроме того, мое намерение сначала создать интернет-зависимость, а затем добавить синхронизацию... Это хорошая идея, или я стреляю себе в ногу? Нужно ли мне синхронизировать его с самого начала?

У кого-то предлагалось создать приложение как локально только сначала, а только для части, доступной только для Интернета, которая имеет определенную логику. Удаленное хранилище очень важно для меня. Я знаю, что решение имеет много общего с моими задачами для приложения, но с точки зрения построения этого, с конечной целью является локальное хранилище + интернет-хранилище и двухсторонняя синхронизация, что будет проще? Или это даже имеет значение?

Для начала я подумываю использовать UUID, а не последовательные целые первичные ключи. Я также думал о назначении каждому устройству идентификатора, который имеет префикс на любых генерируемых им ключах, но это кажется деликатным. Кто-нибудь использовал любую технику? Мысли?

Я думаю, мне нужна хорошая система, чтобы рассказать, какие данные были синхронизированы. На стороне клиента, я думаю, любые записи, которые создаются/редактируются, могут быть помечены для синхронизации. Но на стороне сервера у вас несколько клиентов, поэтому это не сработает. Я предполагаю, что вы могли бы иметь last_updated timestamp и синхронизировать все обновленные синхронизировать последнюю успешную синхронизацию.

Как насчет записей, отредактированных в нескольких местах? Если два клиента редактируют, а затем хотят синхронизировать, у вас есть некоторая двусмысленность в отношении слияния, например, при объединении ветвей в git или других системах управления версиями. Как вы справляетесь с этим? Я предполагаю, что git делает это, сохраняя разности каждого коммита. Думаю, вы могли бы хранить отличия? Чем больше я думаю об этом, тем сложнее это звучит. Я передумал это или не думал об этом?

Как насчет хранилища на стороне клиента? Я думал о SQLite или о локальном хранилище PhoneGap (http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html). Рекомендации? Синхронизация будет проходить через REST API, обмениваясь JSON, поэтому я думал о том, что на самом деле хранит данные как JSON, или что-то похожее на JSON, которое легко конвертировать, было бы неплохо. С другой стороны, если мне нужно будет обменять какой-то формат данных, возможно, что мне нужно хранить?

4b9b3361

Ответ 1

Позвольте мне дать ответ на ваш вопрос на основе моего опыта, связанного с частью синхронизации, поскольку у меня нет достаточного опыта работы с PhoneGap, поэтому пропустим вопрос о локальном хранилище PhoneGap v SQLite.

Мне было интересно, можете ли вы указать мне на некоторые хорошие ресурсы для такого типа синхронизации. Некоторые рекомендуемые библиотеки?

Существует ряд проектов с открытым исходным кодом для синхронизации приложения PhoneGap с удаленным сервером. Но вам, вероятно, придется настраивать их для своих нужд или реализовать свои собственные функции синхронизации. Ниже перечислены некоторые из проектов с открытым исходным кодом. Вы должны знать о них, если вы ищете сеть.

Кроме того, вы можете рассмотреть другие параметры, но это зависит от вашей серверной части:

Кроме того, мое намерение сначала создать интернет-зависимость, а затем добавить синхронизацию... Это хорошая идея, или я стреляю себе в ногу? Нужно ли мне синхронизировать его с самого начала?

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

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

Для начала я подумываю использовать UUID, а не последовательные целые первичные ключи. Я также думал о назначении каждому устройству идентификатора, который имеет префикс на любых генерируемых им ключах, но это кажется деликатным. Кто-нибудь использовал любую технику? Мысли?

Это зависит от ваших спецификаций проекта и, в частности, от вашей серверной части. Например, мобильные сервисы Azure позволяют использовать только целые типы для первичных ключей. Хотя уникальные идентификаторы в качестве первичных ключей довольно удобны в распределенных системах (есть и некоторые недостатки).

Связано с назначением идентификатора устройства - я не уверен, что понимаю этот вопрос, хотя я не знаю особенностей вашего проекта. Посмотрите на алгоритм синхронизации, который используется в нашей системе (двунаправленная синхронизация с использованием REST между несколькими клиентами Android и центральным SQL Server).

Как насчет записей, отредактированных в нескольких местах? Если два клиента редактируют, а затем хотят синхронизировать, у вас есть некоторая двусмысленность в отношении слияния, например, при объединении ветвей в git или других системах управления версиями. Как вы справляетесь с этим? Я предполагаю, что git делает это, сохраняя разности каждого коммита. Думаю, вы могли бы хранить отличия? Чем больше я думаю об этом, тем сложнее это звучит. Я передумал это или не думал об этом?

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

Если вероятность конфликтов в вашей системе будет высокой, например, пользователи будут часто менять одни и те же записи. Затем youd лучше отслеживать, какие поля (столбцы) записей были изменены в вашей синхронизации, а затем после обнаружения конфликта:

  • Итерации через каждое измененное поле записи на стороне сервера в конфликте
  • Сравните каждое измененное поле записи сервера с соответствующим полем клиента.
  • Если поле клиента не было изменено, конфликт отсутствует, поэтому просто перепишите его на серверный.
  • Иначе возникает конфликт, поэтому сохраните содержимое обоих полей во временное место для отчета
  • В конце синхронизации создайте отчет о конфликтах.