Лучшая практика для синхронизации распространенных данных

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

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

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

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

Другой подход состоит в том, чтобы отслеживать все изменения через неиспользуемые объекты. В этом примере объект, которому пользователь присвоил теги. Когда пользователь синхронизирует свои автономные изменения, сервер может заменить свой локальный тег на глобальный. В следующий раз, когда этот клиент синхронизируется с сервером, он обнаруживает изменение в необщем объекте. Когда клиент опускает этот объект, он получает глобальный тег. Программное обеспечение просто сохранит неиспользуемый объект, направив его на тег сервера и оставив его локальную версию. Некоторые проблемы, связанные с этим, - это дополнительные обходы для полной синхронизации, а также дополнительные данные в локальной базе данных, которая является просто потерянной. Существуют ли другие проблемы или ошибки, которые могут возникнуть, когда система находится между состояниями синхронизации? (то есть, пытаясь общаться с сервером и отправляя ему локальные UUID для объектов и т. д.).

Другая альтернатива - избегать общих объектов. В моем программном обеспечении это может быть приемлемым ответом. Я не делаю большой обмен объектами между пользователями, но это не означает, что я НЕ буду этим заниматься в будущем. Что означает, что выбор этой опции может парализовать мое программное обеспечение в будущем, если мне понадобится добавить эти типы функций. У этого выбора есть последствия, и я не уверен, полностью ли я их исследовал.

Поэтому я ищу какой-либо передовой опыт, существующие алгоритмы для работы с системой такого типа, рекомендации по выбору и т. Д.

Ответы на вопрос(3)

Ваш ответ на вопрос