2010-09-01 2 views
8

Мне нужно сделать приложение, которое нужно часто опросить сервер, но GAE имеет ограничения на запросы, поэтому сделать много запросов может быть очень дорогостоящим. Можно ли использовать длительный опрос и запрашивать ожидания до максимума 30 секунд для изменений?Возможно ли длительный опрос в Google App Engine?

ответ

10

Google AppEngine имеет новый API особенность канала, с этим у вас есть с possibility to build a good realtime application.

Другое решение - использовать кометный сервер третьей части, такой как mochiweb или скрученный с шаблоном iframe.

Client1, ожидая событие:

client1 --Iframe Pattern--> Erlang/Mochiweb(HttpLongPolling): 

Client2, отправив сообщение:

client2 --XhrIo--> AppEngine --UrlFetch--> Erlang/Mochiweb 

Чтобы использовать mochiweb с кометой рисунком, Ричард Джонс написал хорошую тему (на Google: Ричард Jones A Million-user Comet Application).

+0

Канал API еще не открыт. Вот еще две альтернативные услуги: http://beaconpush.com http://pubnub.com –

+0

Примечание. Канал API будет прекращен и закрыт в октябре 2017 года. – Suma

0

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

Другой подход - «имитировать» длительный опрос с ограничением 30 секунд. Чтобы сделать это, если сообщение не поступило, скажем, 20 секунд, сервер может отправить сообщение «токен» вместо обычного сообщения, требуя, чтобы клиент использовал его и снова подключился.

Там, кажется feature request (и его приняли) на Google AppEngine для длительного опроса

+1

В Google App Engine теперь есть API каналов для поддержки длительного опроса. –

+0

@Zhe проверить, когда вопрос был отправлен и ответил, Лонг-опрос не был возможен. – naikus

+0

К сожалению, мой плохой ... –

2

Мы попытались реализовать кометное решение для долгого опроса в App Engine со смешанными результатами.

def wait_for_update(request, blob): 
    """ 
    Wait for blob update, if wait option specified in query string. 
    Otherwise, return 304 Not Modified. 
    """ 
    wait = request.GET.get('wait', '') 
    if not wait.isdigit(): 
     return blob 
    start = time.time() 
    deadline = start + int(wait) 
    original_sha1 = blob.sha1 
    try: 
     while time.time() < deadline: 
      # Sleep one or two seconds. 
      elapsed = time.time() - start 
      time.sleep(1 if elapsed < 7 else 2) 
      # Try to read updated blob from memcache. 
      logging.info("Checking memcache for blob update after %.1fs", 
         elapsed) 
      blob = Blob.cache_get_by_key_name(request.key_name) 
      # Detect changes. 
      if blob is None or blob.sha1 != original_sha1: 
       break 
    except DeadlineExceededError: 
     logging.info("Caught DeadlineExceededError after %.1fs", 
        time.time() - start) 
    return blob 

Проблема, которую я вижу в том, что запросы после долгого-опроса один, получают Serialize (синхронное) за запрос давно опроса. Я могу посмотреть на след в Chrome и посмотреть график:

  1. Запрос 1 на адрес. GET (un-modified) blob (дождитесь изменения).
  2. Запрос 2 на отправке. Измените blob.
  3. После полного тайм-аута запрос 1 возврат (данные немодифицированы).
  4. Запрос 2 обрабатывается на сервере и возвращает успех.

Я использовал wirehark и Chrome/timeline для подтверждения того, что я посылаю запрос модификации на сервер на отдельном TCP-соединении из длинного опроса. Таким образом, эта snychronization должна происходить на сервере производства App Engine. Насколько я знаю, Google не документирует эту деталь поведения сервера.

Я думаю, что ожидание API канала - лучшая надежда на то, что мы получаем хорошее поведение в режиме реального времени от App Engine.

Смежные вопросы