Как организовать разрешение конфликтов?

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

1) Допустим есть несколько клиентов, они скачали общий файл, ушли в оффлайн и начали его изменять (сначала клиент 1 изменил данные, затем клиент 2).

2) Клиент 1 соединился с drive, проверил версию файла, например через Custom properties, (https://developers.google.com/drive/properties) и просто добавил свои данные.

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

Есть идея организовать все изменения в виде серии патчей (create, update, delete), а при подсоединении к сети скачивать свежую версию файла, применять к ней патчи (изменения, произведенные в оффлайне), но в момент применения патчей на клиентской стороне данные на сервере могут успеть измениться. Для этого наверное можно через те же Custom Properties организовать блокировку файла, но что делать если клиент не «разблокирует» файл? Ограничить время блокировки? Не очень хорошо если данных много и они на самом деле будут заливаться чуть дольше этого. Или есть более удачное решение такой проблемы, чем мои велосипеды?


upd 1: Небольшие эксперименты с Google Keep показали что он не умеет работать с конфликтами и просто сравнивает время изменения файла и хранит только свежее, т.е. в нашем случае изменения 1 клиента не сохранятся после подключения к сети клиента 2, и актуальными данными будут данные с клиента 2
  • Вопрос задан
  • 3366 просмотров
Решения вопроса 1
@gro
Да как везде в ЦВС.
Если на сервере файл изменён — залить свой изменённый нельзя. Нужно скачать с сервера, смержить (автоматически или если не вышло, вручную) и залить получившееся. Если за это время файл опять изменился, повторить итерацию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Alexeyslav
Программирование, электроника
Вроде бы велосипед изобретаете, существуют же для этих целей системы контроля версий. Но они не ориентированы на произвольные двоичные данные, больше с текстом работают и то порой возникают конфликты которые в общем случае разрешить без вмешательства извне попросту невозможно. Представьте себе ситуацию когда три клиента вдруг решили изменить один и тот же блок, и каждый представляет свои уникальные изменения… кому отдать предпочтение? кто последний, тот и папа? а если при этом 4-й и 5-й вообще предлагают удалить эту часть с данными и вносят еще с десяток исправлений в разные части файла? С двоичными данными, да еще без знания особенностей структуры файла и логики работы с этими данными придумать «универсальное» решение кроме полной блокировки файла ото всех на время внесения исправлений — невозможно. Либо сохранять все варианты модификаций при невозможности устранить конфликт и разбирать их потом вручную.
Ответ написан
opium
@opium
Просто люблю качественно работать
Все уже давно есть в гугл доксе онлайн, правьте онлайн и прикрутите гит и учите людей мержить и разрешать конфликты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы