Я реализую свой первый синхронизирующий код. В моем случае у меня будет два типа клиентов iOS для каждого пользователя, которые будут синхронизировать записи с сервером, используя lastSyncTimestamp
, 64-битное целое число, представляющее эпоху Unix в миллисекундах последней синхронизации. Записи могут быть созданы на сервере или клиентах в любое время, а записи заменяются как JSON через HTTP.
Я не беспокоюсь о конфликтах, так как есть несколько обновлений и всегда от одного и того же пользователя. Тем не менее, мне интересно, есть ли общие вещи, о которых мне нужно знать, это может пойти не так с подходом на основе временной метки, например, синхронизацией во время летнего времени, синхронизацией с другой или другими ошибками.
Я знаю, что git и некоторая другая система управления версиями избегают синхронизации с отметками времени для подхода к синхронизации на основе контента. Я мог бы представить такой подход и для своих приложений, где используются объекты uuid
или hash
, оба одноранговых узла сообщают, какие объекты они принадлежат, и затем обменивают их, пока оба одноранговых узла не будут иметь одинаковые наборы.
Если кто-либо знает какие-либо преимущества или недостатки синхронизации на основе контента и синхронизации на основе временной метки в целом, это также было бы полезно.
Изменить. Вот некоторые из преимуществ/недостатков, которые я придумал для синхронизации времени и контента. Пожалуйста, попробуйте/исправьте.
Примечание. Я определяю синхронизацию на основе контента как простое согласование двух наборов объектов, например, как 2 ребенка будут обменивать карты, если вы дали им каждую часть перепутанной кучи из двух одинаковых наборов бейсбольных карточек и сказал им, что, когда они просматривают их, чтобы объявить и передать любые дубликаты, которые они обнаружили другим, пока оба они не будут иметь одинаковые наборы.
- Джонни: "У меня есть эта карточка".
- Davey - "У меня есть куча карточек. Дайте мне эту карточку".
- Джонни - "Вот твоя карта. Дай мне кучу карточек".
- Дейви - "Вот твоя группа карт".
- ....
- Оба - "Мы закончили"
Преимущества синхронизации на основе времени
- Легко реализовать
- Единственное свойство, используемое для синхронизации.
Недостатки синхронизации на основе времени
- Время - относительное понятие для наблюдателя, и разные машинные часы могут быть не синхронизированы. Есть несколько способов решить эту проблему. Создайте временную метку на одной машине, которая не масштабируется хорошо и представляет собой единую точку отказа. Или используйте логические часы, такие как векторные часы. Для среднего разработчика, строящего собственную систему, векторные часы могут быть слишком сложными для реализации.
- Синхронизация на основе Timestamp работает для того, чтобы клиент мог управлять синхронизацией, но не работает также для синхронизации одноранговых узлов или где синхронизация может происходить с двумя мастерами.
- Единая точка отказа, независимо от того, что генерирует метку времени.
- Время на самом деле не связано с содержимым того, что синхронизируется.
Преимущества контентной синхронизации
- Не нужно сохранять временную метку одноранговой сети. 2 одноранговых узла могут запускать сеанс синхронизации и запускать синхронизацию на основе содержимого.
- Хорошо определенная конечная точка для синхронизации - когда обе стороны имеют одинаковые наборы.
- Разрешает одноранговую архитектуру, где любой одноранговый узел может выступать в роли клиента или сервера, обеспечивая возможность размещения HTTP-сервера.
- Sync работает с содержимым наборов, а не с абстрактным временем концепции.
- Поскольку синхронизация построена вокруг содержимого, синхронизация может быть использована для проверки содержимого, если это необходимо. Например. хэш файл SHA-1 может быть вычислен на контент и использоваться как uuid. Его можно сравнить с тем, что отправлено во время синхронизации.
- Кроме того, хеши SHA-1 могут основываться на предыдущих хэшах, чтобы поддерживать согласованную историю содержимого.
Недостатки синхронизации на основе контента
- Для реализации могут потребоваться дополнительные свойства объектов.
- Больше логики с обеих сторон по сравнению с синхронизацией на основе временной метки.
- Слегка более чатный протокол (это можно настроить путем синхронизации содержимого в кластерах).