15

GAE Channel API を経済的に実行可能にする唯一の方法は、何らかのプール メカニズムを実装することです (アプリ エンジンの上級プロダクト マネージャーの 1 人が、私が法外な価格についてメールしたときに、このことを教えてくれました)。期限切れ。

私はチャネル プールを実装する方法 (場所) についてブレインストーミングを行ってきましたが、私が考える各方法にはかなり深刻な欠点があります。

サーブレットの静的メモリ-- 良いですが、新しい VM インスタンスが開いたり、クライアントがある VM から別の VM に渡されたりすると、かなりの数の開いているチャネルが失われます。

Memcache -- 少なくともメモリはすべての VM からグローバルにアクセスできますが、非アクティブとメモリ プレッシャーにより、非常に有効なチャネルが削除される可能性が高くなります。

バックエンド インスタンス-- 信頼性の点ではおそらく最良のオプションですが、バックエンドを実行するための費用が、最初にプールを実装することによる節約をすべて食い尽くしてしまいます!

不足している VM 間でチャネル プールを実装するためのより良い場所/方法はありますか? または、ここでのオプションの欠点に不必要にこだわっていますか? そうしないと、私のアプリはポーリングに戻す必要があるようです (私の暫定的な指標では、これはわずかに安価に見えます)。

4

2 に答える 2

8

これが私がすることです(あなたの質問を見た後、私は実際にこのライブラリを書くことを考えています.私もそれが必要です):

taskpool次の API を使用してモジュールを作成します。

client_id, token = taskpool.get()

# Setup a heartbeat in the client JS, maybe every minute. 
# Also call this every time the client indicates presence
taskpool.ping(client_id)

taskpool.release(client_id)

実装:

  • client_idとをエンティティに格納し、token使用中かどうか、最後の ping 時刻、および作成時刻を示すステータスを付けます。client_idを鍵にしましょう。NDBの使用も検討してください。無料のメモリキャッシング。

get()未使用のトークンがあるかどうかを確認し、見つかった場合は 1 つ返します。それ以外の場合は、新しいものを作成し、保管して返却してください。

ping()そのトークンの最後の ping 時刻を更新します。ポーリングの代わりに、クライアントが [ハートビート] 回ごとに ping を送信できるようにします。

release()トークンを未使用としてマークします。

[heartbeat] 秒ごとにタスク / cron を実行して、しばらく ping を受信して​​いないトークンを見つけ、それらを未使用として設定します。

クライアントがクローズド トークンを報告した場合は、get().

ただし、セキュリティの損失は、あらゆる種類のトークン プーリングの副産物であることに注意してください。悪意のあるクライアントがトークンを保持し、ハートビートの送信を停止した場合、トークンが転用されると、後で新しいクライアントに渡されるメッセージをリッスンできる可能性があります。これは、完全に公開されているサイトであれば問題ありませんが、覚えておいてください。

これをライブラリとして書き上げる場合は、この回答を更新します。

于 2011-12-21T08:41:31.950 に答える
2

Google App Engine サポート チームによると、チャネル トークンは再利用できない可能性があります。それらを再利用することは期待されていません。

Google App Engine チャネルを再利用できますか?

于 2013-07-05T19:49:39.310 に答える