Ответ 1
Первое, что вам нужно решить, - это общая политика о том, какая сторона считается "авторитетной" в случае противоречивых изменений.
I.e: предположим, что запись № 125 будет изменена на сервере 5 января в 10 часов вечера, и одна и та же запись будет изменена на одном из телефонов (позвоните клиенту А) 5 января в 11 вечера. Последняя синхронизация была 3 января. Затем пользователь снова подключается, например, 8 января.
Определение того, что нужно изменить, "легко" в том смысле, что и клиент, и сервер знают дату последней синхронизации, поэтому все, что было создано или обновлено (см. ниже, чтобы узнать больше об этом), поскольку последняя синхронизация должна согласовываться.
Итак, предположим, что единственная измененная запись - # 125. Вы либо решаете, что один из двух автоматически "выигрывает" и перезаписывает другой, либо вам нужно поддерживать фазу согласования, когда пользователь может решить, какая версия (сервер или клиент) является правильной, перезаписывая другую.
Это решение чрезвычайно важно, и вы должны весить "роль" клиентов. Особенно, если есть потенциальный конфликт не только между клиентом и сервером, но в случае, если разные клиенты могут изменить одну и ту же запись (ы).
[Предполагая, что # 125 может быть изменен вторым клиентом (Клиент B), существует вероятность того, что Клиент B, который еще не синхронизировался, предоставит еще одну версию той же записи, что делает предыдущее разрешение конфликта спорным ]
Относительно "созданной или обновленной" точки выше... как вы можете правильно идентифицировать запись, если она была создана на одном из клиентов (если это имеет смысл в вашей проблемной области)? Предположим, что ваше приложение управляет списком деловых контактов. Если Клиент А говорит, что вы должны добавить недавно созданного Джона Смита, а на сервере есть Джон Смит, созданный вчера клиентом D... вы создаете две записи, потому что не можете быть уверены, что они не разные люди? Вы также попросите пользователя смириться с этим конфликтом?
У клиентов есть "собственность" подмножества данных? То есть если Клиент B настроен как "авторитет" на данные для Области №5, может ли Клиент А изменить/создать записи для Области № 5 или нет? (Это облегчит разрешение конфликтов, но может оказаться неосуществимым для вашей ситуации).
Подводя итог, основные проблемы:
- Как определить "идентификатор", учитывая, что отдельные клиенты не могли получить доступ к серверу перед созданием новой записи.
- В предыдущей ситуации, независимо от того, насколько сложное решение может привести к дублированию данных, вы должны предвидеть, как периодически их решать и как информировать клиентов о том, что то, что они считают "Запись № 675", фактически было объединено с/заменено записью # 543
- Решите, разрешатся ли конфликты с помощью fiat (например, "версия сервера всегда козыряет клиента, если первая была обновлена с момента последней синхронизации" ) или вручную [/li >
- В случае fiat, особенно если вы решаете, что клиент имеет приоритет, вы также должны позаботиться о том, как обращаться с другими, еще не синхронизированными клиентами, которые могут иметь еще несколько изменений.
- Предыдущие элементы не учитывают детализацию ваших данных (чтобы упростить описание). Достаточно сказать, что вместо рассуждения на уровне "Запись", как в моем примере, вы можете найти более подходящим для записи изменений на уровне поля. Или для работы над набором записей (например, Запись человека + Запись адреса + Запись контактов) одновременно, рассматривая их совокупность как своего рода "Мета-запись".
Библиография:
-
Подробнее об этом, конечно, о Wikipedia.
-
SyncML®: синхронизация и управление вашими мобильными данными (Книга по Safari O'Reilly)
-
Оптимистическая репликация YASUSHI SAITO (HP Laboratories) и MARC SHAPIRO (Microsoft Research Ltd.) - ACM Computing Surveys, Vol. V, № N, 3 2005.
-
Александр Трауд, Юрген Наглер-Илейн, Фрэнк Каргл и Майкл Вебер. Синхронизация циклических данных за счет повторного использования SyncML. В материалах девятой Международной конференции по управлению мобильными данными (MDM '08). IEEE Computer Society, Вашингтон, США, 165-172. DOI = 10.1109/MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
-
Lam, F., Lam, N., and Wong, R. 2002. Эффективная синхронизация для мобильных данных XML. В материалах Одиннадцатой международной конференции по управлению информацией и знаниями (McLean, Вирджиния, США, 04 - 09 ноября 2002 г.). CIKM '02. ACM, Нью-Йорк, Нью-Йорк, 153-160. DOI = http://doi.acm.org/10.1145/584792.584820
-
Cunha, P. R. and Maibaum, T. S. 1981. Resource & equil; абстрактный тип данных + синхронизация - методология для ориентированного на сообщения программирования -. В материалах 5-й международной конференции по разработке программного обеспечения (Сан-Диего, Калифорния, США, 09 - 12 марта 1981 г.). Международная конференция по разработке программного обеспечения. IEEE Press, Piscataway, NJ, 263-272.
(Последние три из цифровой библиотеки ACM, не знаю, являетесь ли вы участником или можете получить их через другие каналы).
Из сайта Dr.Dobbs:
- Создание приложений с SQL Server CE и SQL RDA Биллом Вагнером 19 мая 2004 г. (Рекомендации по разработке приложения для настольного и мобильного ПК - Windows/.NET)
Из arxiv.org:
- Неконфликтный реплицированный JSON Datatype - в документе описывается реализация JSON CRDT (Реплицированные типы конфликтов - CRDT) - это семейство структуры данных, которые поддерживают одновременную модификацию и гарантируют конвергенцию таких параллельных обновлений).