Синхронизация с автономной системой


9

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

Если то, что я синхронизирую, генерирует данные с датой (в пределах данных синхронизации) ниже даты последнего изменения моих бизнес-данных, я должен проигнорировать это и просто добавить базу данных для входа. Как только загруженные данные обработаны, данные извлекаются из базы данных и загружаются на устройство.

Из-за этой загрузки сразу после записи синхронизация должна быть синхронной. Можно по-прежнему иметь шаблон чтения / записи, если что-то подобное стоит того, чтобы заменить мое существующее решение. Более важно иметь возможность загружать новейшие данные. Эти данные извлекаются как единое целое, в настоящий момент не реализовано diff (оно может появиться позже, но это не будет проблемой).

У меня может быть несколько синхронизаций на одном и том же бизнес-объекте, это маловероятно, но может случиться, и я предпочитаю иметь возможность справиться с этим. Ожидается, что синхронизация продлится несколько секунд, но не несколько минут, если только в течение нескольких дней не используется встроенное мобильное приложение без повторной синхронизации.

Объем синхронизированных данных не ожидается большим, как и процесс синхронизации.

Поэтому я использую взаимное исключение в моем методе синхронизации, точнее говоря, я использую Java, и я включил синхронизированный метод записи, а не весь процесс синхронизации, чтобы не блокировать синхронизацию только для чтения.

Я бы хотел знать :

  1. Если этот способ имеет смысл? Пока объем и время процесса синхронизации все еще приемлемы.
  2. В общем, какие концепции я должен смотреть. Бонус: если есть какая-либо реализация этих концепций в модуле Spring.

Что вызывает оффлайн? Я имею в виду, когда устройство находится в автономном режиме, это означает, что он не имеет доступа только к серверу или к Интернету тоже нет?
— Laiv

У него нет доступа к интернету. Или не часто.
— Вальфрат

Если у вас есть несколько клиентов / серверов, синхронизирующихся, вы должны сначала принять решение об управлении данными в случае, если что-то отличается. Если вы рассматриваете только прерывистые соединения и несколько клиентов, определенно нет способа сделать это постепенно.
— Тофро

Мастерство данных @tofro легко определить в моем случае, так что это не проблема. Однако, почему было бы невозможно сделать это постепенно с прерывистыми соединениями? Разве я не могу просто использовать последнюю дату синхронизации? Единственной проблемой в моем случае использования такой даты было бы то, как узнать, что данные, которые в настоящее время находятся на моем устройстве, были перемещены и должны быть удалены на устройстве.
— Вальфрат

Из вашего описания я понял, что один и тот же элемент данных может быть изменен на сервере или на одном или нескольких клиентах. Как бы вы осуществили трехстороннюю синхронизацию элемента данных, который перешел на мобильное устройство № 1, затем был изменен на сервере, затем перешел на мобильное устройство № 2 и был заменен там, после чего мобильное устройство № 1 подключилось (с отключенным мобильным устройством № 2)?
— Тофро

Ответы:


1

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

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

Таким образом, вместо того, чтобы клиент отправлял все данные плюс дату на сервер, клиент отправляет событие вместе с номером редакции, который соответствует времени, когда клиент думал, что данные обновлены. Что-то вроде этого:

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

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

После завершения работы сервера он уведомляет всех заинтересованных клиентов об изменениях и новом текущем номере редакции. Затем клиент применяет эти изменения и обновляет свой внутренний номер редакции.

Ваш пробег может отличаться, но я надеюсь, что это поможет.

Изменить. Другое название этого подхода или его разновидности называется очередью сообщений , как упоминалось в этом связанном вопросе .


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

Номер редакции в этом ответе всегда генерируется на сервере, клиент отправляет старые номера редакции, ему не нужно знать о других клиентах, поскольку увеличение редакции не входит в его обязанности. В этом ответе не упоминается разрешение конфликтов, что является наиболее важной частью предлагаемого решения.
— Basilevs

0

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

  1. Даты генерируются на мобильных телефонах? В этом случае вы уверены, что приложение, работающее на мобильных устройствах, всегда будет использовать правильные даты? Как насчет злоумышленника, который может изменить системную дату на своем мобильном устройстве? А как насчет пользователей в разных часовых поясах? Как сказал @jeffrey, возможно, это не лучший способ полагаться на даты, сгенерированные на устройствах.

  2. Если я правильно понял, вы используете Optimistic Concurrency Control . Я не вижу ничего, что было бы по сути неправильно в вашем подходе.

  3. Этот вопрос касается реализации Оптимистической блокировки весной . Может быть, вы можете найти вдохновение в этом.


Мне нужно записать дату, когда действие было выполнено, так как я застрял с датой мобильного телефона. Мобильная дата часто синхронизируется с системой. Только зарегистрированные разработчики могут синхронизироваться с сервером. Что касается безопасности, это еще одна проблема, оставшаяся на данный момент (аутентификация устройства X509, ...)
— Walfrat

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