Первое, что вы должны решить, - это общая политика относительно того, какая сторона считается «авторитетной» в случае противоречивых изменений.
Т.е.: предположим, что запись # 125 изменена на сервере 5 января в 22:00, и такая же запись изменена на одном из телефонов (назовем его клиентом A) 5 января в 23:00.
Последняя синхронизация была 3 января. Затем пользователь воссоединяется, скажем, 8 января.
Определение того, что необходимо изменить, «легко» в том смысле, что и клиент, и сервер знают дату последней синхронизации, поэтому все, что создано или обновлено (подробнее об этом см. Ниже) поскольку последняя синхронизация должна быть согласована.
Итак, предположим, что единственная измененная запись - это # 125.
Вы либо решаете, что одна из двух автоматически «выигрывает» и перезаписывает другую, либо вам необходимо поддерживать фазу согласования, когда пользователь может решить, какая версия (серверная или клиентская) является правильной, перезаписывая другую.
Это решение чрезвычайно важно, и вы должны взвесить «роль» клиентов. Особенно, если существует потенциальный конфликт не только между клиентом и сервером, но и в случае, когда разные клиенты могут изменять одни и те же записи.
[Предполагая, что # 125 может быть изменен вторым клиентом (клиент B), есть вероятность, что клиент B, который еще не синхронизировался, предоставит еще одну версию той же записи, что делает предыдущее разрешение конфликта спорным ]
Относительно пункта " создан или обновлен " выше ... как вы можете правильно идентифицировать запись, если она была создана одним из клиентов (если это имеет смысл в вашей проблемной области)?
Предположим, ваше приложение управляет списком деловых контактов. Если клиент А говорит, что вам нужно добавить недавно созданного Джона Смита, а на сервере есть Джон Смит, созданный вчера клиентом Д ... вы создаете две записи, потому что не можете быть уверены, что они не разные люди? Попросите ли вы пользователя примирить этот конфликт?
Есть ли у клиентов "владение" подмножеством данных? То есть если клиент B настроен как «авторитет» в данных для области № 5, может ли клиент A изменять / создавать записи для области № 5 или нет? (Это упростит разрешение некоторых конфликтов, но может оказаться невозможным для вашей ситуации).
Подводя итог, можно выделить следующие основные проблемы:
- Как определить «идентичность», учитывая, что отдельные клиенты, возможно, не обращались к серверу до создания новой записи.
- Предыдущая ситуация, какой бы изощренной она ни была, может привести к дублированию данных, поэтому вы должны предусмотреть, как периодически их решать и как информировать клиентов о том, что то, что они считали «Запись № 675», фактически было объединено с / заменено Запись # 543
- Решите, будут ли конфликты разрешаться с помощью fiat (например, «версия сервера всегда превосходит клиентскую, если первая была обновлена с момента последней синхронизации») или с помощью ручного вмешательства
- В случае fiat , особенно если вы решите, что клиент имеет преимущество, вы должны также позаботиться о том, как поступить с другими, еще не синхронизированными клиентами, которые могут иметь еще некоторые изменения.
- Предыдущие элементы не учитывают детализацию ваших данных (чтобы упростить описание). Достаточно сказать, что вместо рассуждений на уровне «Запись», как в моем примере, вы можете найти более подходящим для записи изменений на уровне поля, вместо этого. Или для работы с набором записей (например, запись о человеке + запись об адресе + запись о контактах), рассматривая их совокупность как своего рода «мета-запись».
Библиография:
Подробнее об этом, конечно же, в Википедии .
Простой алгоритм синхронизации от автора Vdirsyncer
статья OBJC по синхронизации данных
SyncML®: синхронизация и управление вашими мобильными данными (книга на O'Reilly Safari)
Бесконфликтные реплицированные типы данных
Оптимистичная репликация YASUSHI SAITO (HP Laboratories) и МАРК ШАПИРО (Microsoft Research Ltd.) - ACM Computing Surveys, Vol. V, № N, 3 2005 г.
Александр Трауд, Юрген Наглер-Илейн, Фрэнк Каргл и Майкл Вебер. 2008. Синхронизация циклических данных через повторное использование SyncML. В материалах Девятой международной конференции по управлению мобильными данными (MDM '08). IEEE Computer Society, Вашингтон, округ Колумбия, США, 165-172. DOI = 10,1109 / MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
Лам Ф., Лам Н. и Вонг Р. 2002. Эффективная синхронизация мобильных XML-данных. В материалах одиннадцатой международной конференции по управлению информацией и знаниями (Маклин, Вирджиния, США, 04–09 ноября 2002 г.). CIKM '02. ACM, Нью-Йорк, Нью-Йорк, 153-160. DOI = http://doi.acm.org/10.1145/584792.584820
Cunha, P.R. и 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 - в документе описывается реализация JSON CRDT (Бесконфликтные реплицируемые типы данных - CRDT - это семейство структур данных, которые поддерживают одновременное изменение и гарантируют сходимость такого параллельного обновления).