Возможен ли длительный опрос в Google App Engine? - PullRequest
8 голосов
/ 01 сентября 2010

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

Ответы [ 3 ]

10 голосов
/ 01 сентября 2010

Google AppEngine имеет новую функцию Channel API, с которой у вас есть возможность создать хорошее приложение для реального времени .

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

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

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

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

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

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

2 голосов
/ 30 ноября 2010

Мы пытались внедрить решение Comet-подобного длительного опроса в 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

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

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

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

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

0 голосов
/ 01 сентября 2010

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

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

Похоже, запрос функции (и он принят) в google appengine для длительного опроса

...