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

9

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

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

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

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

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

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

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

  1. Если этот способ имеет смысл? Пока объем и время процесса синхронизации все еще приемлемы.
  2. В общем, какие концепции я должен смотреть. Бонус: если есть какая-либо реализация этих концепций в модуле Spring.
Walfrat
источник
Что вызывает оффлайн? Я имею в виду, когда устройство находится в автономном режиме, это означает, что он не имеет доступа только к серверу или к Интернету тоже нет?
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. Этот вопрос касается реализации Оптимистической блокировки весной . Может быть, вы можете найти вдохновение в этом.

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