Синхронізація з офлайн-системою


9

Я розробляю систему, з якої буду синхронізувати бізнес-дані з мобільного пристрою (у якого є вбудована програма), яка генерує дані та відсилає їх назад на сервер. Кожен рядок, синхронізований, генерує певний журнал бізнесу в базі даних.

Якщо те, що я синхронізую, генерує дані з датою (у межах даних синхронізації), що поступається останній даті модифікації моїх бізнес-даних, я повинен проігнорувати їх та просто додати базу даних журналу. Після опрацювання завантажених даних дані витягуються з бази даних та завантажуються на пристрій.

Через це завантаження відразу після написання синхронізація повинна бути синхронною. Можливо, все ще є модель читача / письменника, якщо щось подібне варто досить замінити моє існуюче рішення. Важливіше - мати можливість завантажувати актуальні дані. Ці дані отримані в цілому, на даний момент різниці не реалізовано (вони можуть з’явитися пізніше, але це не буде проблемою).

У мене може працювати декілька синхронізацій на одному бізнес-об’єкті, це малоймовірно, але може статися, і я вважаю за краще працювати з ним. Очікується, що синхронізація триватиме кілька секунд, але не декілька хвилин, якщо не використовувати вбудований мобільний додаток без повторної синхронізації протягом декількох днів.

Очікується, що обсяг синхронізованих даних не буде великим, як і процес синхронізації.

Отже, я використовую взаємне виключення щодо свого методу синхронізації, точніше, я використовую Java, і я ставлю синхронізований на метод запису не весь процес синхронізації, щоб не блокувати синхронізацію лише для читання.

Я хотів би знати :

  1. Якщо цей спосіб має сенс? Поки гучність і час процесу синхронізації залишаються прийнятними.
  2. Загалом, на які поняття слід звернути увагу. Бонус: якщо в модулі Spring є реалізація цих концепцій.

Що викликає офлайн? Я маю на увазі, коли пристрій офлайн, це означає, що він не має доступу лише до сервера, або до Інтернету також немає?
Лаїв

Він не має доступу до Інтернету. Або не часто.
Вальфрат

Якщо у вас є кілька клієнтів / серверів, що синхронізуються, спочатку потрібно визначитися з майстерністю даних, якщо щось відрізняється. Якщо ви розглядаєте лише переривчасті з'єднання та декілька клієнтів, то це точно не можна робити поступово.
tofro

@tofro освоєння даних у моєму випадку легко визначити, тому це не проблема. Однак чому б не вдалося це робити поступово з переривчастими з'єднаннями? Чи не можу я просто використовувати останню дату синхронізації? Єдиною проблемою в моєму випадку використання такої дати буде те, як знати, що дані, які зараз перебувають на моєму пристрої, переміщені та їх слід видалити на пристрої.
Вальфрат

З вашого опису я зрозумів, що один і той же елемент даних може бути змінений на сервері або на одному або декількох кількох клієнтах. Як би ви тризначно синхронізували елемент даних, який перейшов на мобільний номер 1, потім був змінений на сервері, потім перейшов на мобільний номер 2 і там був змінений, потім мобільний номер 1 з'єднується (з відключеним мобільним телефоном №2)?
tofro

Відповіді:


1

Один із підходів, який я деякий час досліджував (з певним успіхом), щоб синхронізувати дані клієнта з даними сервера, не покладаючись на дати (які можуть бути ненадійними) або синхронні запити, - це комбінація патчів JSON (можливо, POJO s у вашому випадку) та пошук подій .

Основна ідея полягає в тому, що замість того, щоб зберігати поточний стан на клієнті та сервері, клієнт і сервер зберігають список змін та повідомляють один одного через події або запити виправлення.

Отже, замість того, щоб клієнт надсилав усі дані плюс дату на сервер, клієнт надсилає подію разом із номером ревізії, який відповідає останньому разу, коли клієнт думає, що дані оновились. Щось на зразок цього:

Server.send("MODIFY FOO", 3);

Як тільки сервер отримує цю подію (асинхронно), він узгоджує її з іншими подіями, які він, можливо, вже отримав. Наприклад, можливо, що інший клієнт, що працює з тими ж даними, можливо, вже змінив деякі речі, і тепер номер ревізії на сервері дорівнює 5. Таким чином, цю версію потрібно застосувати до того, як будуть застосовані останні 2, і всі клієнтам потрібно буде повідомити про цю зміну.

Після завершення роботи сервера він повідомляє всіх зацікавлених клієнтів про внесення змін та новий номер поточного перегляду. Потім клієнт застосовує ці зміни та оновлює свій внутрішній номер перегляду.

Ваш пробіг може відрізнятися, але я сподіваюся, що це допоможе.

Редагувати: інша назва цього підходу або його варіанту називається чергою повідомлень , як згадується в цьому пов'язаному питанні .


Система може бути в автономному режимі (немає доступу до сервера) протягом декількох днів і повинна реєструвати дату, коли подія сталася, а не коли подія була синхронізована з сервером. Ось чому я повинен використовувати дати. У мене є номер редакції і для optimisticLocking, але з тієї ж причини 2 пристрої могли завантажити версію X POJO, і коли вони синхронізуються пізніше, кожен похід відправки, який повинен генерувати версії X + 1 і X + 2. І пристрої не можуть спілкуватися один з одним.
Вальфрат

Ревізійний номер у цій відповіді завжди генерується на сервері, клієнт надсилає старі ревізійні номери, він не повинен знати про інших клієнтів, оскільки збільшення редакції не є його відповідальністю. Ця відповідь не згадує вирішення конфлікту, що є найважливішою частиною запропонованого рішення.
Василевс

0

Перша проблема - використання дат як спосіб синхронізації даних. Я справді впевнений, що я не отримав усіх деталей вашого рішення, але я сказав би це:

  1. Чи створюються дати на мобільних телефонах? У цьому випадку ви впевнені, що додаток, що працює на мобільних телефонах, завжди використовуватиме правильні дати? Що з шкідливим користувачем, який дещо може змінити системну дату на своєму мобільному пристрої? Що щодо користувачів у різних часових поясах? Як вам сказав @jeffrey, можливо, це не найкращий підхід покладатися на дати, створені на пристроях.

  2. Якщо я правильно зрозумів, ви використовуєте оптимістичний контроль за сумісністю . Я не бачу нічого, що є інтрисично неправильним у вашому підході.

  3. Це питання стосується впровадження оптимістичного блокування навесні . Можливо, ви можете знайти в цьому трохи натхнення.


Мені потрібно записати дату, коли дія було виконано, тому що я затримався з датою мобільного телефону. Мобільна дата часто повторно синхронізується з системою. Лише зареєстровані користувачі можуть синхронізуватись із сервером. Що стосується безпеки, то зараз залишається ще одна проблема (автентифікація пристрою X509, ...)
Walfrat

Дата може бути записана як ще одне поле даних, не потрібно трактувати це як маркер синхронізації.
Василевс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.