Мы пытались внедрить решение 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 отправлен.GET (немодифицированный) BLOB-объект (дождитесь изменения).
- Запрос 2 отправлен.Измените BLOB-объект.
- После полного тайм-аута запрос 1 возвращается (данные не изменены).
- Запрос 2 обрабатывается на сервере и возвращает успех.
Я использовал wireshark и Chrome / timeline, чтобы подтвердить, что Я отправляю запрос на изменение на сервер по отдельному соединению TCP от длинного опроса.Так что эта синхронизация должна происходить на производственном сервере App Engine.Насколько мне известно, Google не документирует эту деталь поведения сервера.
Я думаю, что ожидание API канала - лучшая надежда на то, что мы получим хорошее поведение в реальном времени от App Engine.