Как объединить несколько редакций заметок в одну версию? - PullRequest
0 голосов
/ 03 марта 2019

Простите, если этот вопрос задавался ранее.Я уверен, что это имеет классическую проблему.Но, тем не менее, я спрошу об этом, так как я не смог найти решение.

  • У меня есть API стека mongo / mongoose / node для приложения для создания заметок.
  • Пользователиприложение может открывать его на разных устройствах или на вкладках браузера и иногда заканчивать тем, что перезаписывает свои собственные заметки.

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

  1. Пользователь открывает приложение в телефоне (в автономном режиме)
  2. Позже пользователь открывает приложение в браузере и редактирует определенную заметку.
  3. Пользователь возвращается к приложению в телефоне и редактируетта же заметка.Теперь приложение для телефона.отменяет изменения, сделанные в # 2, потому что телефон "не синхронизирован".

Существует две основные проблемы:
1. Приложение не запускает синхронизацию.Он остается несинхронизированным, если пользователь не нажимает кнопку «Обновить» вручную.
2. Объединение двух заметок затруднительно, поскольку оно не так просто, как последнее, являющееся авторитетным, а, скорее, мне кажется, что нужно объединить два вместеэлегантно (думаю, github diff)

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

TLDR;Я получил несколько заметок.Мне нужно объединить их.Они могут различаться.

Ответы [ 3 ]

0 голосов
/ 09 марта 2019

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

0 голосов
/ 13 марта 2019

Это распространенная проблема, особенно для мобильных сред.Интересный подход заключается в использовании сервисных работников в прогрессивном веб-приложении.Они будут удерживать ваши сетевые запросы до тех пор, пока пользователь снова не будет подключен к сети, а затем обрабатывать их, когда вы снова подключитесь.

Эта статья может объяснить этот подход более подробно, чем я мог бы здесь:

https://developers.google.com/web/updates/2015/12/background-sync

ПРИМЕЧАНИЕ: это было написано в 2015 году, и в этом направлении многое прогрессировало.Сервисные работники еще не доступны в iOS, но ожидается, что они будут поддерживаться в ближайшие пару лет.

0 голосов
/ 07 марта 2019

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

  1. Приложение не запускает синхронизацию

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

Эту проблему можно решить, вызвав синхронизацию, наблюдая за состоянием navigator.online .1. когда он изменится на false, начните буферизацию пользовательских изменений.2. когда он изменится на true, извлеките новые изменения с сервера, затем нажмите буферизованные действия.

Слияние двух нот ...

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

Мы обнаружили, что лучше всего обрабатывать проблемы синхронизации как можно ближе к источнику.Мы содержали проблемы с синхронизацией на стороне клиента, поэтому поврежденные данные никогда не попадут в БД.

Сама синхронизация ведет себя как git merge.

Когда автономное устройство извлекает обновленные данные, онобудет пытаться объединить буферизованные действия до отправки его на сервер.

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

Я надеюсь, что этопомогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...