Обновление данных Ajax. Extjs

Мне нужно обновлять определенные данные (в сетке), и я собирался проводить опрос на сервере каждые 15 секунд или около того, чтобы получать данные и обновлять сетку, однако это кажется немного грязным (сетка будет иметь загрузку значок каждые 15 секунд..) выглядит не очень...
Другой вариант — проверить, есть ли новые данные, сравнить новые данные с текущими данными и обновить сетку, только если есть есть ли какие-либо изменения (хотя я должен был бы сделать это на стороне клиента, потому что сохранение текущего состояния каждого вошедшего в систему пользователя также кажется излишним)
Я уверен, что есть лучшие решения, и хотел бы услышать о них

Я слышал о COMET, но это кажется излишним
Кстати, я использую asp.net MVC на стороне сервера.

Я хотел бы услышать, что люди говорят за или против непрерывного опроса с помощью js.


person roundcrisis    schedule 16.11.2009    source источник
comment
привет: спасибо. Это реализация кометы, как я уже говорил в вопросе, это немного перебор.   -  person roundcrisis    schedule 24.11.2009


Ответы (5)


Похоже, COMET действительно то решение, которое вы ищете. В этом сценарии вам не нужно ни опрашивать, ни сравнивать, так как вы можете вытолкнуть в свою сетку только «соответствующие» измененные данные.

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

Вот демонстрация с использованием ExtJS и ASP.NET, которая продвигает непрерывный поток акций обновления тикера. Демонстрация немного больше, чем вам нужно, но принцип идентичен.

person jvenema    schedule 23.11.2009

Каждый раз, когда вы получаете ответ от сервера, проверяйте, не изменилось ли что-то.

Сделайте запрос. Сообщите пользователю, что вы работаете с каким-то счетчиком, не скрывайте этого. Запланируйте следующий запрос через 15 секунд. Выполняется следующий запрос; если ничего не изменилось, запланируйте следующий через 15 + 5 секунд. Выполняется следующий запрос; если ничего не изменилось, запланируйте следующее через 15 +5 +5 секунд. И так далее. Выполняется следующий запрос; если что-то действительно изменилось, сбросьте интервал до 15 секунд.

Prototype может делать это полуавтоматически с помощью Ajax.PeriodicalUpdater, но вам, вероятно, нужны вещи, более адаптированные к вашим потребностям.

Во всяком случае, просто идея.


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

person Kaze no Koe    schedule 16.11.2009
comment
Спасибо за ответ. Для типа приложения, которое я пытаюсь создать, обновления должны быть постоянными, они не могут исчезнуть. - person roundcrisis; 16.11.2009

Я полагаю, что Comet не является излишним, если «обновления должны быть постоянными». 15 секунд — это очень часто; Вас посещают многие? Ваш сервер может быть поглощен обслуживанием этих запросов, в то время как другие будут голодать.

person Upperstage    schedule 17.11.2009
comment
Я думаю, что в таких ситуациях, черт возьми, должен быть хороший инструмент для нагрузочного тестирования. - person roundcrisis; 18.11.2009
comment
Как насчет seleniumhq.org или badboy.com.au Я использовал BadBoy для тестовой загрузки (некоторое время назад), и мне это понравилось. - person Upperstage; 18.11.2009
comment
Я пробовал селен, но он действительно не очень хорошо масштабируется, может быть, я делаю это неправильно? Т.е. я могу протестировать автоматизацию нескольких браузеров одновременно, но не более того. - person roundcrisis; 19.11.2009
comment
Боюсь, у меня нет большого практического опыта работы с Selenium, хотя я могу написать, что работал над проектом (25 разработчиков), где мы посвятили 4 разработчика полный рабочий день Selenium и автоматизированным тестам. У нас была полная поддержка нашего государственного заказчика. Демонстрации/тесты были впечатляющими. - person Upperstage; 19.11.2009

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

  1. Опросить сервер, отправив метку времени последнего опроса службы (например: lastPollTime).
  2. Сервер использует отметку времени, чтобы определить, какие данные являются новыми/обновленными, и возвращает только эти данные (дельту), уменьшая размер передаваемых данных и упрощая код на стороне клиента.
  3. Он может быть пустым, это может быть несколько ячеек, это может быть вся сетка, но клиент всегда обновляет возвращаемые ему данные, потому что они уже известны как новые.

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

Кроме того, это позволяет вам поддерживать состояние на стороне сервера, поскольку вам не нужно сохранять состояние для каждого отдельного пользователя. У вас есть только одно состояние, состояние текущих данных, которое различается временем доступа.

person Justin Johnson    schedule 24.11.2009

Я думаю, что проверить, есть ли какие-либо новые данные, это хороший вариант.

Я бы подсчитал количество строк в базе данных и сравнил их с количеством строк в вашей (HTML) таблице. Если они не совпадают, получите разницу в строках.

Скажем, у вас есть 12 строк таблицы и 14 строк базы данных, когда вы проверяете: Получить последние (14 - 12) = 2 строки.

person richard    schedule 16.11.2009