Улучшить функциональность синхронизации данных клиент-сервер с дельтами

Приложение
У меня есть веб-приложение, которое в настоящее время использует AppCache для автономной работы, так как пользователям системы необходимо создавать документы в автономном режиме. Документ сначала создается в автономном режиме, и когда доступен доступ в Интернет, пользователь может нажать "синхронизация", которая отправит документ на сервер и сохранит его как ревизию. Чтобы быть более конкретным, приложение не сохраняет изменение delta как ревизию (точное изменение поля), а весь документ целиком. Другими словами, сохраняется документ "моментальный снимок".

Проблема
Пользователи могут входить в систему из разных браузеров и устройств и работать с их документами. Когда они нажимают "sync", если документ сервера более новый, полная версия клиента будет переопределена сервером. Это приводит к одной основной проблеме, которая изображена на изображении ниже.

введите описание изображения здесь

Сценарий выше происходит из-за текущей реализации, которая не зависит от дельт (небольшие изменения) и скорее полагается на изменения моментальных снимков.

Некоторые вопросы

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

2) Должна ли каждая дельта применяться независимо?

2) Согласно моему исследованию, дельта пересмотра имеет числовое значение, а не временную метку. Каким должно быть значение для этого? Как я могу гарантировать, что сервер и клиент согласятся с тем, какой номер версии должен быть?

Информация о стеке

  • Angular на интерфейсе
  • IndexedDB для сохранения документов локально (автономный режим)
  • Postgres DB с JSONB в бэкэнд

Ответ 1

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

  • Документы Google: A делает редактирование в автономном режиме, B делает редактирование онлайн, A выйдет в сети, Sync, Google Docs объединяет изменения A и B.
  • Примечания к Apple: такие же, как Документы Google
  • Git/Subversion: выдайте ошибку, попросите пользователя разрешить конфликты.
  • Wunderlist: последнее изменение перезаписывает предыдущие

Для вашего случая это простейшее решение - использовать подход Wunderlist, но, похоже, это может вызвать проблему юзабилити. Что ожидают ваши пользователи?

Отвечая на ваши вопросы напрямую:

  • Выполнение пользовательской синхронизации необходимо, если вы не хотите перезаписывать.
  • Это решение для удобства использования, чего ожидает пользователь?
  • Правда, ревизии являются числовыми (например, r1, r2). Чтобы получить соглашение с сервером, измените возвращаемое значение последнего запроса синхронизации. Вы можете вернуть всю модель клиенту каждый раз (или всего 200 OK, если произошла обычная синхронизация). Если модель возвращается клиенту, обновите клиент последней моделью.

В любом случае сервер всегда должен быть источником правды. Этот пост содержит некоторые полезные рекомендации по ссылочной целостности серверов и мобильных устройств:

Для отслеживания вставок вам нужна созданная временная метка... Чтобы отслеживать обновления, вам нужно отслеживать временную метку LastUpdate в ваших строках... Для отслеживания удалений вам нужна таблица надгробных камней.

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