Google App Engine ではロングポーリングが可能ですか?
-
26-09-2019 - |
質問
サーバーを頻繁にポーリングする必要があるアプリケーションを作成する必要がありますが、GAE にはリクエストに制限があるため、大量のリクエストを行うと非常にコストがかかる可能性があります。ロングポーリングを使用して、リクエストが変更されるまで最大 30 秒間待機することは可能ですか?
解決
はGoogleのAppEngineのは、新しい機能チャンネルAPIを持っています A 可能に優れたリアルタイムアプリケーションを構築します。
別の解決策は、mochiwebような第3部分コメット・サーバを使用することです またはIFRAMEパターンとねじれ。
クライアント1、イベント待機中:
client1 --Iframe Pattern--> Erlang/Mochiweb(HttpLongPolling):
クライアント2、メッセージを送信します:
client2 --XhrIo--> AppEngine --UrlFetch--> Erlang/Mochiweb
リチャード・ジョーンズが良いと書かれており、彗星パターンとmochiwebを使用するには トピック(Googleで:リチャード・ジョーンズA百万ユーザー彗星アプリケーション)。
他のヒント
私たちは 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 が送信されました。(変更されていない) BLOB を取得します (変更されるまで待機します)。
- リクエスト 2 が送信されました。BLOB を変更します。
- 完全なタイムアウトの後、リクエスト 1 が返されます (データは変更されていません)。
- リクエスト 2 はサーバー上で処理され、成功を返します。
Wireshark と Chrome/タイムラインを使用して、ロングポーリング接続とは異なる TCP 接続でサーバーに変更リクエストを送信していることを確認しました。したがって、この同期は App Engine 本番サーバー上で行われている必要があります。私の知る限り、Google はサーバーの動作の詳細を文書化していません。
App Engine から優れたリアルタイム動作を得るには、チャネル API を待つことが最善の望みだと思います。
私は長いポーリングが可能であるとは思いません。 GoogleのAppEngineのためのデフォルト要求タイムアウトは30秒です。 ロングポーリングでメッセージを生成するために、30以上の秒を要した場合、それは失敗します。 おそらく、よりよい短いポーリングを使用してオフになっています。
別のアプローチは、30秒の制限をwithing「シミュレーション」長いポーリングです。メッセージは以内に到着しない場合は、これを行う20秒を言うために、サーバーは、それを消費して、再度接続するためにクライアントを必要とする代わりに、通常のメッセージの「トークン」メッセージを送ることができます。
があり機能要求であると思われる(とそのロングポーリングのGoogle AppEngineの上で)受け入れ