Что самый умный и свободный доступ должен синхронизировать данные между несколькими объектами?

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

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

Так или иначе вот несколько вопросов, связанных с синхронизацией, на которую мы должны ответить прежде, чем начать реализовывать синхронизацию:

  • Каковы новые данные? Как я хочу представить его?
  • Что я делаю в случае конфликта? Слияние? Я предлагаю и спрашиваю пользователя, что сделать?
  • Что я делаю, когда я вхожу в непоследовательное состояние (например, разъединение из-за хлопьевидного соединения сети мобильной связи)?
  • Что я должен сделать, когда я не хочу входить в непоследовательное состояние?
  • Как я возобновляю текущую синхронизацию, которая была прервана?
  • Как делают я обрабатываю хранение данных (например, база данных MySQL по веб-сервису, Базовые Данные по iPhone; и как я объединяюсь/синхронизирую данные без большого количества кода связующего звена)?
  • Как я должен обработать редактирования от пользователя, которые происходят во время синхронизации (который работает в фоновом режиме, таким образом, UI не заблокирован)?
  • Как и в котором направлении, я распространяю изменения (например, пользователь создает „Нечто “запись на его компьютере и не синхронизирует; затем он собирается уходить и создает другое „Нечто “запись; что происходит, когда он пытается синхронизировать оба устройства)? У пользователя будет два „Нечто “записями с различными уникальными идентификаторами? У пользователя будет только одна запись, но который?
  • Как я должен обработать синхронизацию, когда у меня есть иерархические данные? Сверху вниз? Вверх дном? Я рассматриваю каждую запись атомарно, или я только смотрю на суперузел? Насколько большой компромисс между упрощением вещей и инвестированием слишком большого количества времени в реализацию?

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

45
задан Brian Tompsett - 汤莱恩 10 January 2016 в 15:25
поделиться

3 ответа

Где я работаю, мы разработали «автономное» версию нашего Главное (Web) приложение для пользователей может работать над своими ноутбуками в местах, где у них нет доступа в Интернет (я не уверен, сколько из этих мест на самом деле существует в наши дни, но мне сказали, что они делают;) ). Когда пользователь возвращается на главный сайт, им нужно синхронизировать данные, которые они ввели в автономном режиме с нашим основным приложением.

Итак, чтобы ответить на ваши вопросы:

  • Какие самые последние данные? Как я хочу представлять его?

У нас есть столбец last_updated_date на каждой таблице. Сервер проходит трек, когда происходит синхрониения, поэтому, когда оффлайн приложение запрашивает синхронизацию, которую говорит сервер «Эй, только дайте мне данные изменились с этой даты».

  • Что я делаю в случае конфликта? Слияние? Я подскажу и спрошу Пользователь, что делать?

В нашем случае автономное приложение может обновить только относительно небольшое подмножество всех данных. Поскольку каждая запись синхронизируется, мы проверяем, является ли это одним из этих случаев, и если так, то мы сравниваем last_updated_date для записи как онлайн, так и в автономном режиме. Если даты отличаются, то мы также проверяем значения (потому что это не конфликт, если они оба обновлены до того же значения). Если есть конфликт, мы записываем разницу, установите флаг, чтобы сказать, что есть как минимум один конфликт, и продолжайте проверять остальные детали. После того, как процесс будет завершен, если флаг «ISConflict» устанавливается, пользователь может перейти на специальную страницу, которая отображает различия и определяет, какие данные являются «правильной» версией. Эта версия затем сохраняется на хосте и флаг «ISConflict» сбрасывается.

  • Что мне нужно сделать, когда я не хочу попасть в непоследовательную Государство?
  • Как возобновить текущую синхронитую, которая прервала?

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

  • Как обращаться с хранением данных (например, база данных MySQL на веб-сервисе, Core Данные на iPhone; и как я могу Слияние / синхронизация данных без много Клейкий код)?

Мы используем стандартные базы данных в области приложений, так и объекты Java между ними. Объекты сериализуются для XML (и отчеты для ускорения передачи) для фактического процесса синхронизации, а затем распакованный / десериализованный на каждом конце.

  • Как я должен обрабатывать изменения от пользователя, который произошел во время синхронизации (который работает на заднем плане, поэтому UI не заблокирован)?

Эти изменения будут иметь место после даты начала синхронизации, и поэтому не будет подняты на другой стороне до следующей синхронизации.

  • Как и в каком направлении я распространяю изменения (например, пользователь создает запись "фу" на своем компьютере и не синхронизируется; Затем он находу и создает еще одну запись «фу»; какие происходит, когда он пытается синхронизировать оба Устройства)? У пользователя есть два "Foo" Записи с разными уникальными идентификаторами? У пользователя есть только одна запись, но Какой?

Это зависит от вас, чтобы решить, как вы хотите справиться с этим конкретным Foo ... I.e. В зависимости от того, что первичный ключ Foo и как вы определяете, является ли один Foo такой же, как другой.

  • Как я должен обрабатывать синхронизацию, когда у меня есть иерархические данные? Сверху вниз? Вверх дном? Я лечу каждую запись атомно или я только смотрю на Supernode?

Синхронизация является атомной, поэтому, если одна запись не удалась, то весь процесс помечен как неполное, аналогичное транзакцию Commite Subversion.

  • Насколько велико компромисса между упрощенными вещами и инвестированием Слишком много времени в реализации?

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

Надеюсь, что поможет вам или, по крайней мере, дает вам несколько идей! :)

50
ответ дан 26 November 2019 в 21:27
поделиться

Вероятно, «не реальный вопрос», вот не настоящий ответ:

Я думаю, что распределенные системы управления версиями (такие как Mercurial или Git) выяснили большую часть этого. Однако они требуют, чтобы люди принимали, что может быть более одной «самой последней» версии, и что иногда противоречивые обновления нуждаются в ручном разрешении для разрешения. Кроме того, если вы не заинтересованы в сохранении всей истории изменений, в этих системах достаточно накладных расходов (но, конечно, недавняя история необходима для поиска общих предков, чтобы определить, как две версии относятся).

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

В то же время подход iTunes-iPod является самым простым: у вас есть только одна главная библиотека, и каждое устройство тянет оттуда. Очевидно, что одиночная синхронизация не очень удовлетворительная во всех сценариях (особенно когда участвует более одного пользователя), но все же, я был бы признателен, если бы больше приложений предложили возможность работать так (Pet Peeve: у меня есть три Mac , с тремя установками iPhoto. Если они синхронизируются автоматически от одного выделенного мастера, как и фото синхронизация для моего iPod, это было бы улучшением).

4
ответ дан 26 November 2019 в 21:27
поделиться

Если он передан в качестве аргумента, вызовите ArgumentStartException .

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

-121--3229701-

Попробуйте выполнить следующие действия:

java -cp jar1:jar2:jar3:dir1:. HelloWorld

Путь к классам по умолчанию (если не существует переменной среды CLASSPATH) является текущим каталогом, поэтому при переопределении этого пути убедитесь, что текущий каталог (.) добавляется к пути к классам, как это было сделано.

-121--2025533-

Хотя это действительно полезно в экосистеме Майкрософт, вы можете изучить Мобильные блоки приложений .

-1
ответ дан 26 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: