Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

Чтобы использовать MOCHIWEB с помощью Comet Pattern, Ричард Джонс написал хорошую тему (в Google: Richard Jones Million-User Comet Application).

Другие советы

Мы пробовали реализовать комета-подобное длительному раствору на приложении приложений, со смешанными результатами.

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 отправлено. Получить (не изменено) BLOB (подождите, пока не изменено).
  2. Запрос 2 отправлено. Измените BLOB.
  3. После полной тайм-аута, запрос 1 возвращается (данные немодифицированы).
  4. Запрос 2 обрабатывается на сервере и возвращает успех.

Я использовал WireShark и Chrome / Timeline, чтобы подтвердить, что я отправляю запрос модификации на сервер в отчетливом соединении TCP из длинного опроса. Таким образом, эта Snychronization должна работать на сервере производства приложений. Google не документирует эту деталь поведения сервера, насколько я знаю.

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

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

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

Там, кажется, Запрос на функцию (и его принятый) на Google Appengine для длительного опроса

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top