11

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

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

enter image description here

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

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

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

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

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

Stack информация

  • угловые на интерфейсе
  • IndexedDB, чтобы сохранить документы локально (в автономном режиме)
  • Postgres БД с JSONB в бэкэнде
+1

Связанные: http://stackoverflow.com/questions/28797992/best-practices-in-syncing-data –

+0

Git уже делает это, может быть, как-то использовать его, чтобы показать разницу пользователя документа. –

+1

Ответ Джека Уэйда суммирует все для вас. С помощью инструмента/скрипта diff вы можете получить дельта, большинство из которых не должно иметь конфликтов (например, отредактированные строки), а затем вам нужно выяснить, как лучше разрешить любые конфликты (например, наши, их, ручное слияние , последние победы и т. д.). –

ответ

5

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

  • Google Docs: A делает редактировать в автономном режиме, B делает редактировать онлайн, A идет в Интернете, синхронизация, Google Docs сочетает в себе А и редактирует Б
  • Apple, отмечает: То же, что Google Docs
  • Git/Subversion: Throw ошибку, запрашивает у пользователя разрешать конфликты
  • Wunderlist: Последнее изменение перезаписывает предыдущий

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

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

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

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

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

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

+0

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

+1

@dipole_moment Хорошо, это классическая проблема в управлении версиями. Я обновлю. –