Первое, что вам нужно решить, - это общая политика в отношении того, какая сторона считается «авторитетной» в случае противоречивых изменений.
I.e .: Предположим, что запись № 125 была изменена на сервере 5 января в 10 часов вечера, и одна и та же запись была изменена на одном из телефонов (назовем ее клиентом А) 5 января в 11 вечера. Последняя синхронизация была 3 января. Затем пользователь снова подключается, например, 8 января.
Определение того, что нужно изменить, «легко» в том смысле, что и клиент, и сервер знают дату последней синхронизации, так что ничего создано или обновлено (подробнее об этом см. Ниже) синхронизация должна быть согласована.
Итак, предположим, что единственная измененная запись - 125. Вы либо решаете, что один из двух автоматически «выигрывает» и перезаписывает другой, либо вам нужно поддерживать фазу согласования, когда пользователь может решить, какая версия (сервер или клиент) является правильной, переписывая другую.
Это решение чрезвычайно важно, и вы должны весить «роль» клиентов. Особенно, если есть потенциальный конфликт не только между клиентом и сервером, но в случае, если разные клиенты могут изменить одну и ту же запись (записи).
[Предполагая, что # 125 может быть изменен вторым клиентом (Клиент B), существует вероятность того, что Клиент B, который еще не синхронизировался, предоставит еще одну версию той же записи, что делает предыдущее разрешение конфликта moot]
Относительно "", созданного или обновленного "пункт выше ... как вы можете правильно идентифицировать запись, если она была создана на одном из клиентов (при условии, что это имеет смысл в вашей проблемной области)? Предположим, что ваше приложение управляет списком деловых контактов. Если Клиент А говорит, что вы должны добавить недавно созданного Джона Смита, а на сервере есть Джон Смит, созданный вчера клиентом D ... вы создаете две записи, потому что не можете быть уверены, что они не разные люди? Вы попросите пользователя смириться с этим конфликтом?
У клиентов есть «собственность» подмножества данных? То есть если Клиент B настроен как «авторитет» на данные для Области №5, может ли Клиент А изменить/создать записи для Области № 5 или нет? (Это упростит разрешение конфликтов, но может оказаться неосуществимым для вашей ситуации).
Резюмируя основные проблемы:
- Как определить «идентичность», учитывая, что отдельные клиенты не могли получить доступ к серверу, прежде чем создавать новую запись.
- В предыдущей ситуации, независимо от того, насколько сложным было решение, может возникнуть дублирование данных, поэтому вы должны предвидеть, как периодически их решать и как информировать клиентов о том, что то, что они считают «Запись № 675», фактически было объединено с/вытеснены Запись № 543
- Решите, если конфликты будут разрешаться приказном (например, «версия сервера всегда козырей клиента, если первый был обновлен с момента последней синхронизации») или ручного вмешательства
- в случае от fiat, особенно если вы решили, что клиент имеет приоритет, вы также должны заботиться о том, как обращаться с другими, еще не синхронизированными клиентами, которые могут иметь некоторый re меняется.
- Предыдущие элементы не учитывают детализацию ваших данных (чтобы упростить описание). Достаточно сказать, что вместо рассуждения на уровне «Запись», как в моем примере, вы можете найти более подходящим для записи изменений на уровне поля. Или работать над набором записей (например, Запись человека + Запись адреса + Запись контактов) одновременно, рассматривая их совокупность как своего рода «Мета-запись».
Библиография:
Более подробно об этом, конечно же, на Wikipedia.
A simple synchronization algorithm автором Vdirsyncer
OBJC article on data synch
SyncML®: Synchronizing and Managing Your Mobile Data (книги на O'Reilly Safari)
Conflict-free Replicated Data Types
Optimistic Replication Ясуши Саито (HP Laboratories) и MARC SHAPIRO (Microsoft Research Ltd.) - ACM Computing Surveys, Vol. V, No. N, 3 2005.
Alexander Traud, Juergen Nagler-Ihlein, Frank Kargl и Michael Weber. Синхронизация циклических данных за счет повторного использования 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., 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. Ресурс &equil; абстрактный тип данных + синхронизация - методология для ориентированного на сообщения программирования -. В материалах 5-й международной конференции по разработке программного обеспечения (Сан-Диего, Калифорния, США, 09 - 12 марта 1981 г.). Международная конференция по разработке программного обеспечения.IEEE Press, Piscataway, NJ, 263-272.
(Последние три из цифровой библиотеки ACM, не знаю, являетесь ли вы участником или можете получить их через другие каналы).
С Dr.Dobbs сайта:
- Создание приложения с CE SQL Server и SQL RDA Билл Вагнер 19 мая 2004 (Лучшая практика для разработки приложения как для настольных и мобильных ПК - Windows/.NET)
От arXiv.org:
- A Conflict-Free Replicated JSON Datatype - документ описывает реализацию JSON CRDT (бесконфликтного Repli cid datatypes - CRDTs - это семейство структур данных, которые поддерживают одновременную модификацию и гарантируют конвергенцию таких параллельных обновлений).
Благодарим вас за ответ. Мне очень интересно читать о часто используемых/возможных решениях (плюсах, минусах, сравнениях) для проблем, которые вы наметили. –
Я полагаю, вы уже проверили Википедию и материал, на который они ссылаются, не так ли? –
+1 Это отличная статья с очень важной информацией об этой проблеме. Один недостающий пункт: синхронизация удаленных записей. –