2017-11-22 14 views
0

GWTベースのJava WebアプリケーションがGoogle App Engineにデプロイされています。このアプリケーションでは、サーブレットはメモリ内の状態を読み取り、変更します。クライアントコードは、この状態を変更し、その後同じ状態を変更または読み取る要求を送信することがあります。そのため、クライアントページの同じインスタンスからのすべてのリクエストが、アプリケーションのバージョンの同じインスタンスに移動することが重要です。同じクライアントからのすべてのリクエストを同じインスタンスに移動する必要があります

私は大量のトラフィックは期待していないので、インスタンスの最大数を1に制限しても構いませんが、そのインスタンスが多かれ少なかれ永続的に存在するようにしたいと思います。 (ユーザーがリクエスト間で1時間以上かかる場合は、データが失われても構いません)

詳しくは、私が状態を管理する方法は、ハッシュテーブルには、文字列が状態にマッピングされます。クライアントからの最初の要求では、新しい一意の文字列が作成され、新しい状態と新しいエントリがハッシュテーブルに作成されます。応答に文字列が返されます。その後の要求では、クライアントは文字列を送信して、サーブレットが変更または読み込みが必要な状態を見つけることができます。状態は非常に複雑であり、まったく直列化できないため、状態をデータベースに保存することはできません。

特定のクライアントインスタンスからのすべての要求が同じサーバーインスタンスに送信されるようにする方法はありますか?

答えて

3

特定のクライアントインスタンスからのすべての要求が同じサーバーインスタンスに送信されるようにする方法はありますか?

方法はありません。要求間で状態を永続的に保持する場合は、memcacheをキャッシュとして使用してデータストアを使用します。

追加:データストレージが貧弱な場合は、Cookieを使用して、必要に応じて難読化/暗号化を行うこともできます。

App Engineは、アプリケーションが要求間に本質的な状態を保持していないとみなします。これにより、インスタンスのスピンアップ/シャットダウンが問題にならないようになります。

1

私が2番目の答えは、GAEは、あなたが望むものに正確には合っていません。

でも可能ですが、いくつかの特定のケースでしかありません。手動のスケーリングで標準のGAE環境を使用しており、その後のリクエストは常に前回のレスポンスに埋め込まれたURLに基​​づいています要求。

次のリクエストが同じインスタンスにヒットするように、ターゲットのルーティングルールに従ってリクエストに対する応答でURLを作成することができます。 Targeted routingから:

  • それでもmanually-scaled servicesを持っているbackendsかを使用している場合は、ターゲットとインスタンスIDを含む によってインスタンスにリクエストを送信することができます。インスタンスIDは、実行しているインスタンスの合計数まで0〜 の整数であり、そして以下のように指定することができる :

が特定の範囲内の特定のサービスとバージョンに要求を送信しますインスタンス:

https://INSTANCE_ID-dot-VERSION_ID-dot-SERVICE_ID-dot-MY_PROJECT_ID.appspot.com 
http://INSTANCE_ID.VERSION_ID.SERVICE_ID.MY_CUSTOM_DOMAIN 

注:インスタンスをターゲットオートスケーリングや基本的なスケーリングのために設定されているサービスではサポートされていません。インスタンスIDは、 の整数で、0から最大インスタンス数 までの範囲である必要があります。スケーリングタイプまたはインスタンスクラスに関係なく、 サービスまたはそのインスタンス内のバージョンを対象とすることなく、特定のインスタンスに要求を送信することは可能です( )。

は、たとえば、あなたがthe modules API使用できるインスタンスのIDを決定するには、次のターゲットにインスタンスがダウンした場合、あなたは永久にエラーが発生して続けること

// Get the instance handling the current request. 
int currentInstance = modulesApi.getCurrentInstance(); 

注意を(そのインスタンスが戻って来ることはありません)ので、別のインスタンスにフローをつなげることができる場所からインスタンスベースの非ベースのページに何らかの形で移行するためのフォールバックのソリューションを考えることができます。

しかし、このようなソリューションは、GAEのフレックス環境では利用できません。

注:Targeted routingから柔軟な環境では、インスタンスをターゲットにすることはできません。特定の インスタンスに直接リクエストを送信することはできません。

+0

回避策として、インスタンスIDを対象にしようとすると、ちょっとした並べ替えが行われますが、涙が出ます。 –

+0

確かに、私はそれをお勧めしません。 –

関連する問題