Flex - лучшая стратегия для синхронизации данных клиента с базой данных?
В приложении Adobe Flex, использующем удаленное взаимодействие BlazeDS AMF, какова наилучшая стратегия поддержания актуальности локальных данных и их синхронизации с базой данных бэкэнда?
В типичном веб-приложении веб-страницы обновляют представление при каждой их загрузке, поэтому данные в представлении никогда не бывают слишком старыми.
В приложении Flex существует возможность загрузить дополнительные данные заранее для совместного использования на вкладках, панелях и т. Д. Эти данные обычно обновляются из бэкэнда реже, поэтому существует большая вероятность того, что они устарели - что приводит к проблемы при сохранении и т. д.
Итак, как лучше всего преодолеть эту проблему?
а. создать приложение Flex, как если бы оно было веб-приложением - перезагружать данные бэкэнда при каждом возможном изменении представления
б. игнорируйте проблему и просто решайте проблемы устаревших данных, когда они возникают (риск раздражать пользователей, которые с большей вероятностью будут работать с устаревшими данными)
с. что-то другое
В моем случае сохранение канала данных открытым через LiveCycle RTMP не вариант.
7 ответов
А. Подумайте об оптимизации внутренних изменений через прокси-сервер, который делает свое собственное уведомление или опрос: он знает, являются ли какие-либо из данных грязными, и быстро вернет (а-ля 304), если нет.
б. Часто пользователи смотрят больше, чем они касаются. Рассмотрим один уровень обновления для поиска и другой, когда они запускаются и продолжают редактировать.
Посмотрите на BuzzWord: он блокируется при редактировании, но также автоматически сохраняет и разблокирует часто.
ура
Вам не нужны Livecycle и RTMP для того, чтобы иметь механизм уведомлений, вы можете сделать это с каналами BlazeDS и использовать стратегию потокового / длинного опроса
Если вы не можете использовать протокол обмена сообщениями в BlazeDS, то я должен согласиться с тем, что вам следует проводить RTMP-опрос по HTTP. Данные сжимаются при использовании RTMP в AMF, что помогает ускорить процесс, поэтому клиент долго ждет между обновлениями. Это также позволит вам впоследствии перейти на методы push, если клиент продукта решит оплатить дополнительное оборудование и лицензии.
Я нашел эту статью о синхронизации:
http://www.databasejournal.com/features/sybase/article.php/3769756/The-Missing-Sync.htm
Это не входит в технические детали, но вы можете догадаться, какой код будет реализовывать эту стратегию.
У меня также нет причудливых уведомлений от моего сервера, поэтому мне нужны стратегии синхронизации.
Например, у меня есть список компаний в моем modelLocator. Он не часто меняется, он недостаточно велик, чтобы рассмотреть разбиение на страницы, я не хочу перезагружать все это (removeAll()) при каждом действии пользователя, но я не хочу, чтобы мое приложение аварийно завершало работу или ОБНОВЛЯЛО поврежденные данные в Если он был ОБНОВЛЕН или УДАЛЕН из другого экземпляра приложения.
То, что я делаю сейчас, это сохранение в СЕССИИ ВЫБРАТЬ дату и время. Когда я возвращаюсь для обновления данных, я выбираю, где last_modified>$SESSION['lastLoad']
Таким образом, после загрузки данных меняются только строки (в большинстве случаев 0 строк).
Очевидно, вам нужно ОБНОВИТЬ last_modified для каждого ВСТАВКИ и ОБНОВЛЕНИЯ.
Для DELETE это более сложно. Как указывает парень в своей статье: "Как мы можем отправить запись, которой больше не существует"
Вам нужно указать flex, какой элемент он должен удалить (скажем, по идентификатору), чтобы вы не могли действительно УДАЛИТЬ при УДАЛЕНИИ:)
Когда пользователь удаляет компанию, вместо этого вы делаете ОБНОВЛЕНИЕ: удалено =1 Затем в компаниях по обновлению для строки, где удалено =1, вы просто отправляете обратно идентификатор для сгибания, чтобы убедиться, что эта компания больше не входит в модель.
И последнее, но не менее важное: вам нужно написать функцию, которая будет очищать строки, где удалено =1, а last_modified старше, чем... 3 дня или что вы считаете нужным.
Хорошо, что если пользователь удалил строку по ошибке, она все еще находится в базе данных, и вы можете сохранить ее от реального удаления в течение 3 дней.
Вместо того, чтобы кэшировать на гибком клиенте, почему бы не сделать кэширование на стороне сервера? Некоторые причины,
1) Когда вы кэшируете данные на стороне сервера, они централизованы, и вы можете убедиться, что все клиенты имеют одинаковое состояние данных
2) На стороне сервера гораздо лучше доступны опции для кэширования, чем для flex. Также у вас может быть задание cron, которое обновляет данные на определенной частоте каждые 24 часа.
3) Поскольку данные кэшируются на сервере, и нет необходимости каждый раз получать их из базы данных, связь с flex будет намного быстрее
С уважением, Tejas
В прошлом я пошел с выбором "а". Если вы используете удаленные объекты, вы можете настроить логику в стиле кэша, чтобы синхронизировать их на удаленном конце.
Сэм
Вы не можете использовать RTMP через HTTP (HTTP Polling)? Таким образом, вы все еще можете использовать RTMP, и хотя он намного медленнее, чем реальный RTMP, вы все равно можете обновлять в этом режиме.
У нас есть приложение, которое использует RTMP, чтобы сигнализировать о вставках, обновлениях и удалениях, просто передавая RTMP-сообщения, содержащие пару Table / PrimaryKey, оставляя приложение для автоматического обновления своих данных. Мы делаем это через Http, используя RTMP.