1

GAE ベースのアプリにログインしているクライアントをログに記録し、情報を待っています (違いがある場合は GWT アプリ)。REST データを受信して​​データストアに保存するサーブレットもあります。情報は特定のクライアントに宛てられます。私の目標は、受信サーブレットからユーザー セッションのサーブレットに通知を渡すことです。私のデータ転送の制限時間は 60 秒、1 日あたり 1,000 ユーザー、1 回のブラウザ セッションで 1 時間、セッションあたり 5 回の通知です。

次のシナリオを検討しました。

ユーザー クライアントは 60 秒ごとにデータを要求し、データストアにクエリを実行して新しいデータを取得します。

このアプローチは単純に悪いものです。データストアの電力を大量に浪費し (1 日あたり 1000*60*n のデータストア読み取り操作)、プロセッサ時間と大きなメモリ フットプリントを大量に消費します。

通知を渡すための memcache の使用

受信者は通知を memcache に入れ、クライアントはそれをチェックし、成功した場合はデータストアを読み取ります。1 つの例外を除いて、すべて問題ありません。ドキュメントには「memcache は信頼できない」と記載されているため、memcache に何もない場合は、データストアも確認する必要があります。その結果、メモリ/プロセッサのフットプリントが大きくなり、より複雑なソリューションが得られます。

キュー

ほぼ良い解決策 - メッセージをパイプに入れ、反対側で読むだけです。この特定のケースでは、クォータをはるかに超える 1 日 1,000 のキューを作成するか、ドキュメントに「実験的であり、将来変更される可能性があるなど」と記載されている場合、キューでタグを使用する必要があります。アプリケーションの重要な部分として「実験的」サービスを使用することは、私を満足させません。

チャネル

少しトリッキーな解決策。ブラウザーは接続時にチャネルを開き、受信データで受信サーブレットは通知をチャネルに入れるだけで、通知された Web クライアントはデータストアからデータを更新するために独自のサーブレットを呼び出します。このアプローチで私が嫌いなのは、通信回線です。Web クライアントを介したサーブレット間の通知は、おそらく最善の方法ではありません。

GAE クラウドで、あるサーブレットから別のサーブレットに通知を渡すためのより良いアイデアはありますか?

4

1 に答える 1

1

これは古い問題です。ポーリングまたはプッシュのいずれかを実行できます。

  1. ポーリング:これは、上記の1と2で行うことです。2つをマージすることを提案します:ユーザーが新しいデータを持っていない場合でも、memcacheを使用し、適切なオブジェクトをmemcacheに配置します。この場合、3つの状況すべてをカバーできます(1.すべてのデータがない、2。新しいデータがない、3。新しいデータ)、コストを最小限に抑えるためにmemcacheを使用します。

  2. データのプッシュ-これは、コストを最小限に抑え、新しいデータをユーザーに即座に通知するため、推奨される方法です。Channel APIを使用します-これがGWTラッパーです:gwt-gae-channel

于 2012-11-26T11:41:26.227 に答える