Я ищу руководство о том, как лучше всего думать о разработке высокоуровневого прикладного протокола синхронизировать метаданные между устройствами конечного пользователя и сервером.
Моя цель: пользователь может взаимодействовать с данными приложения по любому устройству, или в сети. Цель этого протокола состоит в том, чтобы передать изменения, внесенные на одной конечной точке в другие конечные точки через сервер, и гарантировать, чтобы все устройства поддержали последовательное изображение данных приложения. Если пользователь внесет изменения на одном устройстве или в сети, то протокол продвинет данные к центральному репозиторию, от того, где другие устройства могут вытянуть его.
Некоторые другие мысли дизайна:
Как конкретный пример, можно думать о Dropbox (это не то, что я продолжаю работать, но он помогает понять модель): на диапазоне устройств пользователь может справиться, файлы и папки — перемещают их, создают новые, удаляют старые и т.д. И в моем контексте "метаданные" были бы файловой структурой и структурой папок, но не фактическим содержанием файла. И поля метаданных были бы чем-то как файл/имя папки, и время модификации (все устройства должны видеть то же время модификации).
Другим примером является IMAP. Я не прочитал протокол, но моими целями (минус фактические тела сообщения) является то же.
Чувствует, что существует два главных подхода, как это сделано:
Править: в некоторых ответах справедливо говорится, что существует недостаточно информации о приложении для предложения достаточно хороших предложений. Точный характер приложения мог бы быть недовольным, но очень простое приложение чтения RSS является достаточно хорошим приближением. Таким образом, скажем, спецификация приложения следующая:
На основе этого дизайна я могу настроить свое приложение на одном устройстве: добавьте набор подачи, переименуйте и переупорядочьте их и считайте некоторые объекты на них, которые затем отмечены как непрочитанные. Когда я переключаю устройства, другое устройство может синхронизировать конфигурацию и показать мне тот же список канала с теми же именами, порядком и теми же состояниями чтения объекта / непрочитанными состояниями.
(закончите редактирование),
Что я хотел бы в ответах:
Пара мыслей:
1). Какие предположения вы можете сделать о надежности доставки уведомлений об изменениях? И о надежности заказа этих уведомлений? Я считаю, что лучше мириться с потерями и неправильным порядком, возвращаясь к запросу полной повторной доставки метаданных.
2). По сути, у вас есть поток мета-данных, а также поток данных. Какие предположения вы можете сделать об их относительном упорядочении. Можете ли вы получить данные новой версии до того, как придут метаданные? Снова гадая, я подозреваю, что это может произойти. Я бы ожидал, что полезная нагрузка данных должна содержать информацию о версии метаданных. Следовательно, клиенты могут обновлять мета-данные, когда им это необходимо?
3). Возможно ли, чтобы данные, соответствующие двум различным версиям мета-данных, поступали на устройство. Я подозреваю, что "да". Как легко клиент может справиться с этим?
4). Возможно, мета-данные должны включать информацию о представлении или проверке.
Метаданные, которые вы описали, звучат как граф. Однако переход на трек OWL / RDF может оказаться серьезным сдвигом. По сути, вам просто нужно иметь свойства объектов, которые могут быть связаны между собой (например, файлы, выровненные по иерархии). С этой точки зрения JSON - очень естественный выбор для доступа к свойствам в сочетании с REST API. Если выбран этот подход, я рекомендую сначала изучить Open Data Protocol .
Кстати, почему бы просто не использовать систему контроля версий, например Git , и есть ли свойства объектов JSON внутри текстовых файлов в системе? Если метаданные каждого объекта хранятся в очень маленьком фрагменте JSON в отдельном файле, система автоматически сможет выполнять большую часть обновлений и автоматического разрешения конфликтов. Большинство систем контроля версий предоставляют хороший APIS для этого типа целей.
Если бы я хотел сделать это быстро, не тратя слишком много времени на разработку, я бы просто использовал WebDAV для файла (ов) метаданных, и все готово. ИМО, это должно покрыть большинство ваших требований. Кроме того, использование существующего протокола имеет преимущества перед пользовательскими протоколами в существующих библиотеках, так как не нужно тратить время на изобретение колеса и отладку кода реализации протокола.
РЕДАКТИРОВАТЬ: Если вы упростите объединение файла конфигурации в файл, вам просто нужно сохранить 2 версии файла конфигурации. Одна базовая версия, как выглядела конфигурация при последней синхронизации. Одна текущая версия метаданных, а затем вы получите версию метаданных вашего коллеги.С этими 3 файлами вы выполняете простое трехстороннее слияние, вы автоматически решаете конфликты для более новой версии, и все. Важно сохранить базовую версию. Теперь, если вы объединяетесь с несколькими клиентами, вы можете объединяться в разных точках и, следовательно, требовать другую версию вашего файла конфигурации в качестве основы. Просто сохраняйте каждый результат синхронизации, пока вы не перезапишете его новой синхронизацией от этого однорангового клиента. Теоретически у вас могут быть файлы конфигурации XML, но трехстороннее слияние файлов XML просто болезненно, а инструментов еще нет, imho. Конкретный формат или тип приложения на самом деле не имеет значения.