Решение проблем с обновлением / обновлением данных в веб-приложении в целом (или в частности, в GWT) - PullRequest
0 голосов
/ 17 апреля 2010

В целом, как вы, ребята, справляетесь с взаимодействием пользователя с обновлениями / актуальностью данных (проблема пользовательского интерфейса) в веб-приложениях?

Например:

  • Многопользовательское веб-приложение (например, управление проектами)
  • Вход в "виртуальное" пространство
  • Люди могут обновлять имена проектов и т. Д.
  • Как справиться с такой ситуацией, что:
    • пользователь-A и пользователь-B загружают проект с заголовком «Project StackOverflow»
    • пользователь-B обновляет заголовок «Project StackExchange»
    • пользователь-А обновляет заголовок после операции обновления пользователя Б до «Project Basecamp»

Вопрос, который я задаю, связан с пользовательским интерфейсом, а не с транзакционной операцией.

Что делает большинство людей в этой ситуации?

  • Что бы вы сделали после того, как пользователь-B обновит заголовок на экране / представлении пользователя-А?
  • Что произошло , когда пользователь-A пытается обновить заголовок после того, как пользователь-B завершил свою операцию обновления?
    • Сообщаете ли вы пользователю-A, что заголовок изменился, и он / она должен перезагрузить страницу?
    • Вы идете вперед и меняете заголовок и позволяете пользователю B иметь старые данные?
  • Есть ли у вас какой-то механизм блокировки на уровне приложения? (если кто-то обновляет, никто другой не может?)
  • Или исправить рабочий процесс приложения? (у кого есть доступ, чтобы иметь возможность менять вещи и т. д.).

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

Я часто сталкивался с этой конкретной проблемой в приложении GWT, в частности, когда модели доменов передаются, и обновление всей стороны приложения / клиента не является оптимальным решением для меня (поскольку это означает всю «загрузку» / фаза инициализации должна быть выполнена снова в этой конкретной среде).

Может быть, ответ - держаться подальше от GWT? :)

Рад слышать варианты, решения и советы от вас, ребята.

Спасибо

1 Ответ

0 голосов
/ 17 апреля 2010

Общим ответом на проблемы устаревания данных на клиенте является опрос или отправка сервером ( Comet ), в зависимости от того, насколько важно иметь актуальную информацию.

При опросе ваш клиент отправляет запрос на получение свежей информации каждые N минут и показывает обновленные данные в пользовательском интерфейсе (желательно не перезагружать весь пользовательский интерфейс, только части, которые были обновлены).

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

Блокировка затруднена, потому что она требует большой координации между всеми сторонами. Сервер должен сообщить второму клиенту, чтобы он запросил модель, которая заблокирована, а затем еще раз, когда она разблокирована, и клиент должен знать, хочет ли он вообще внести изменения (что, если пользователь-А сделал такое же изменение user-B хотел сделать?). В целом, поддержание всех клиентов в актуальном состоянии и на разумных условиях - лучший ответ.

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

Проект rocket-gwt включает поддержку Comet, и я слышал об этом много хорошего, хотя сам никогда не пробовал.

Аналогичный параметр, хотя и не используемый сразу, это HTML5 WebSockets , который устраняет необходимость постоянного подключения к серверу, открывая специальный прямой «канал» между сервером и клиентом. К сожалению, в настоящее время WebSockets поддерживаются только в небольшом наборе браузеров. Надеюсь, что по мере роста усыновления это будет лучшим вариантом. При этом, если вы хотите использовать WebSockets в GWT, я написал некоторый код , чтобы сделать это (бесстыдная самореклама)

...