Подтвердить что ты не робот

Offline/Online Data Synchronization Design (Javascript)

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

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

Кроме того, существуют ли проекты с открытым исходным кодом, реализующие этот тип вещей? Я не над копированием кода другого пользователя (если лицензия разрешает), и я рад порту.

4b9b3361

Ответ 1

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

Ответ 2

У меня была аналогичная проблема. Я решил использовать чисто JSON in и out. Решение, которое я принимаю в форме:

  • поймать форму отправить событие
  • проверить, находится ли пользователь в сети.
  • если пользователь в сети, тогда отправьте форму как обычную форму POST
  • Если пользователь находится в автономном режиме, то стройте запрос JSON и храните его локально (я решил использовать базу данных Web SQL). Таблица очередей - это просто Uri и полезная нагрузка.

Затем у меня есть глобальные крючки событий для онлайн-событий. Когда пользователь возвращается в сеть, он проверяет очередь, и если в очереди есть элементы, она отправляет их через запросы JSON POST.

Если вы в первую очередь заинтересованы в получении данных JSON и кешировании его для использования в автономном режиме, посмотрите jquery.offline.

Задача с синхронизацией в обоих направлениях состоит в том, что вам необходимо обновить локальные кешированные списки с любой работой CRUD, которую вы поставили в очередь.

Я хотел бы найти более общий способ сделать это.

Ответ 3

Откажитесь от Derby, Node MVC-фреймворка, который обладает довольно приятными функциями синхронизации и разрешения конфликтов. http://derbyjs.com/

Ответ 4

в нашей команде мы уже создали приложение в автономном/онлайн режиме.

мы используем следующие следующие библиотеки:

В режиме автономной работы мы кэшируем все файлы ресурсов и jst-шаблон для отображения содержимого на странице. backbonejs и backbonejs-localStorage помогает сделать приложение MVC на клиенте. это довольно здорово, вы должны попробовать. мы всегда используем localstorage для сохранения данных. когда мы создаем сообщение, например, объект модели и сохраняем его в localStorage, мы запускаем очереди для синхронизации (также у нас есть рабочий стол таймера для автоматического запуска процесса синхронизации). Для каждой модели у нас есть отдельный класс синхронизации, который должен запускаться триггером синхронизации очереди. если ваш navigator.onLine = > true, мы отправляем запросы на сервер с данными для обновления. если вы закроете браузер, в любом случае вы не потеряете свои данные, потому что у вас есть очереди в localStorage. в следующий раз клиент будет синхронизировать данные по первой загрузке с помощью navigator.onLine = > true.

Как использовать стойку в автономном режиме, вы можете проверить мой небольшой проект в github:

pomodoro-app

Удачи!

Ответ 5

Я лично рекомендую вам написать обертку поверх индексированного интерфейса API, который проверяет, находитесь ли вы в сети/в автономном режиме.

  • если в автономном режиме, просто сохраните в indexedDB и установите флаг persisted на false во всех документах
  • если он доступен в Интернете, получите все документы, в которых они сохраняются, и хранят их в mongodb или что-то среднее на бэкэнд, а затем сохраняют новые документы как в indexedDB, так и на сервере с сохраненным флагом в true.

Я написал небольшой файл

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

Ответ 6

Я столкнулся с той же проблемой и в итоге использовал XML файл для хранения и git для отслеживания изменений и фиксации их автоматически, как только будет доступно соединение. Синхронизация выполняется с помощью обычных команд git commit/push/pull в оболочке script и cronjob, начиная с script. Это также будет работать, если вы сохраните JSON в текстовом файле.

Ответ 7

В настоящее время я работаю над подобным webapp. Я решил сделать такой рабочий процесс:

  • Форма на самом деле не отправлена ​​- кнопка "Отправить" фактически сохраняет сериализованные данные формы в localStorage (в некоторой очереди). Это избавляет от проблем с подачей заявки и от написания дополнительного кода обработки ошибок для обработки разъединения во время отправки формы.
  • Транспорт после script запускается после сохранения данных. Он проверяет состояние онлайн/оффлайн.
  • В режиме онлайн он пытается отправить последние данные из очереди на сервер (запрос AJAX) и удаляет их из очереди при успешном завершении (и продолжает отправлять следующие данные из очереди после короткого таймаута).
  • Это повторная проверка shedules через некоторый период времени (через setTimeout()).

Ответ 8

Если вы хотите использовать потенциально тяжелую инфраструктуру Ext JS/Sencha, у нее есть хороший API данных с автономной поддержкой (например, localStorage) и прокси-подход для записи через локальный сервер. Я использую Sencha Touch (для мобильных устройств).

Для отладки веб-хранилища проверьте Weinre.

Ответ 9

DerbyJS, вероятно, лучшее решение. Однако Derby все еще находится в разработке, и автономная поддержка только в планировании и еще не реализована. В группе Google (http://groups.google.com/group/derbyjs/browse_thread/thread/7e7f4d6d005c219c) вы можете найти дополнительную информацию о том, что планируется в будущем.