Перше, що вам слід вирішити, це загальна політика щодо того, яка сторона вважається "авторитетною" у разі суперечливих змін.
Тобто: припустимо, запис № 125 змінено на сервері 5 січня о 22:00, і той самий запис змінено на одному з телефонів (назвемо його Клієнтом А) 5 січня о 23:00. Останній синхрон був 3 січня. Потім користувач повторно підключається, скажімо, 8 січня.
Визначити, що потрібно змінити, є "простим" у тому сенсі, що і клієнт, і сервер знають дату останньої синхронізації, тому все, що було створено або оновлено (докладніше про це див. Нижче), оскільки останню синхронізацію потрібно узгодити.
Отже, припустимо, що єдиний змінений запис - це # 125. Ви або вирішите, що одна з двох автоматично "виграє", а другу замінить, або вам потрібно підтримати фазу узгодження, коли користувач може вирішити, яка версія (сервер або клієнт) є правильною, замінивши іншу.
Це рішення надзвичайно важливо, і ви повинні зважити "роль" клієнтів. Особливо, якщо існує потенційний конфлікт не тільки між клієнтом та сервером, але у випадку, якщо різні клієнти можуть змінити однакові записи.
[Припускаючи, що # 125 може бути змінений другим клієнтом (Клієнт B), існує ймовірність того, що Клієнт B, який ще не синхронізувався, надасть ще одну версію того самого запису, що робить попереднє вирішення конфлікту неправдивим]
Щодо пункту " створено або оновлено " вище ... як ви можете правильно визначити запис, якщо він створений одним із клієнтів (якщо це має сенс у вашому проблемному домені)? Припустимо, ваша програма керує списком ділових контактів. Якщо клієнт А каже, що вам потрібно додати нещодавно створеного Джона Сміта, а на сервері є Джон Сміт, створений вчора Клієнтом Д ... чи створюєте ви два записи, оскільки ви не можете бути впевнені, що це не різні особи? Ви попросите користувача також примирити цей конфлікт?
Чи мають клієнти "право власності" на підмножину даних? Тобто, якщо Клієнт B налаштований на «повноваження» даних для Зони №5, чи може Клієнт А змінювати / створювати записи для Зони №5 чи ні? (Це полегшить вирішення конфліктів, але може виявитись нездійсненним для вашої ситуації).
Підводячи підсумок, основними проблемами є:
- Як визначити "ідентичність", враховуючи, що відключені клієнти, можливо, не мали доступу до сервера до створення нового запису.
- Попередня ситуація, хоч би яким складним було рішення, може призвести до дублювання даних, тому ви повинні передбачити, як їх періодично вирішувати та як повідомляти клієнтам, що те, що вони вважали "записом №675", насправді було об'єднано / замінено Запис No 543
- Вирішіть, чи будуть конфлікти вирішуватися за допомогою fiat (наприклад, "Версія сервера завжди перевершує клієнтську, якщо перша була оновлена після останньої синхронізації") або за допомогою втручання вручну
- У випадку фіату , особливо якщо ви вирішите, що клієнт має пріоритет, ви також повинні подбати про те, як поводитися з іншими, ще не синхронізованими клієнтами, які можуть намітити ще кілька змін.
- Попередні елементи не враховують деталізацію ваших даних (щоб спростити опис). Досить сказати, що замість міркувань на рівні "Record", як у моєму прикладі, ви можете виявити більш доцільним запис змін на місцевому рівні. Або працювати над набором записів (наприклад, Запис особи + Запис адреси + Запис контактів) одночасно, розглядаючи їх сукупність як свого роду "Метазапис".
Бібліографія:
Більше про це, звичайно, у Вікіпедії .
Простий алгоритм синхронізації від автора Vdirsyncer
Стаття OBJC про синхронізацію даних
SyncML®: Синхронізація та керування вашими мобільними даними (книга на O'Reilly Safari)
Безконтактні реплікаційні типи даних
Оптимістична реплікація YASUSHI SAITO (HP Laboratories) та MARC SHAPIRO (Microsoft Research Ltd.) - Обстеження обчислювальної техніки ACM, вип. V, NoN, 3 2005.
Олександр Трауд, Юрген Наглер-Іхляйн, Франк Каргл і Майкл Вебер. 2008. Циклічна синхронізація даних шляхом повторного використання SyncML. У матеріалах дев'ятої міжнародної конференції з управління мобільними даними (MDM '08). Комп'ютерне товариство IEEE, Вашингтон, округ Колумбія, США, 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
Кунья, PR та Майбаум, TS 1981. Ресурс & equil; абстрактний тип даних + синхронізація - Методологія програмування, орієнтованого на повідомлення -. У матеріалах 5-ї міжнародної конференції з програмної інженерії (Сан-Дієго, Каліфорнія, США, 9 - 12 березня 1981 р.). Міжнародна конференція з програмної інженерії. IEEE Press, Piscataway, NJ, 263-272.
(Останні три - із цифрової бібліотеки ACM, не маючи уявлення, чи є ви членом або можете отримати їх за іншими каналами).
З сайту Dr.Dobbs :
- Створення додатків за допомогою SQL Server CE та SQL RDA, автор Білл Вагнер, 19 травня 2004 р.
З arxiv.org:
- Безконфліктний реплікаційний тип даних JSON - у статті описується реалізація JSON CRDT (безконфліктні реплікаційні типи даних - CRDT - це сімейство структур даних, які підтримують одночасну модифікацію та гарантують зближення таких одночасних оновлень).