4

GAE はステートレスだと言われました。私は一般的にステートレスの概念を理解していますが、概念的にそれを GAE 型システムに適用する際にいくつかのガイダンスを使用できます。

私が開発したアプリが干渉の問題を抱えているように見えるため、特にこの質問をしています。つまり、2 人以上が同時に使用すると混乱します。(エラーが同時使用中にのみ発生することを確認するために、バグテストを続けています。)理論的には、このような干渉が発生する可能性がある2つの方法があることを認識しています。またはb。サーバーレベルで。私の質問: 後者は実際に可能ですか? アプリがサービスを提供しているときに、プログラム内の変数の状態を変更するなどして、あるユーザーが別のユーザーに干渉することはありますか? それとも、これは無国籍によって防がれているのでしょうか? 私は混乱しており、質問を誤解している可能性があります。ナマステ。

4

3 に答える 3

7

いくつかの用語を混同していると思います。まず、何語を使っていますか?これはJavaまたはPythonですか?

GAE は「ステートレス」であるとあなたに言った人は、彼らが何について話しているのかわかりません。GAE は Web サーバー プラットフォームであり、アプリのステートフル性はユーザー次第です。HTTP はステートレス プロトコルです (そして、GAE は http を使用する Web アプリケーションを構築するためのものです) が、セッションを完全にオンにして、ユーザーのステートフル性を実現することができます。

あなたが説明しているエラー状態は、同時実行性の 1 つです。GAE に共有リソース (データストア、memcache など) があり、高レプリケーション データストアを使用している場合は、データストアにも結果整合性があります。

GAE は、同じサーバー インスタンスが同じ人物による複数の要求を処理することを保証しません。また、デフォルトではマルチスレッドはありません (いずれにしても Java では、Python についてはわかりません)。マルチスレッドを使用しない場合、任意の時点で任意のインスタンスに 1 人しか存在しません。ただし、マルチスレッドを有効にする場合は、コードがスレッドセーフであることを確認する必要があります。そうしないと、1 つのインスタンスで 2 人のユーザーが変数を変更することができますが、これは GAE に固有のものではありません。

2 人のユーザーが 2 つの異なるサーバーまたは同じ memcache エントリで同じデータストア エンティティを変更する可能性があり、その場合はトランザクションなどを使用してコーディングする必要があります。また、結果整合性では、書き込みと読み取りの間に遅延が生じる可能性があるためデータを書き込み、別のユーザーがすぐにそれを読み取ると、同じ値が返されない可能性があります。

于 2012-04-13T18:35:33.140 に答える
5

GAE は引き続き (仮想?) サーバーを実行して、HTTP 要求を処理します。サーバー インスタンスは、起動し、多数の要求を処理し、シャットダウンする場合があります。任意の時点で、多数のサーバー インスタンスがすべて実行されている可能性があります。2 つの連続した HTTP 要求が、同じサーバー インスタンスまたは別のサーバー インスタンスによって処理される場合があります。ソフトウェアが実行されるサーバー インスタンスがわからないため、ソフトウェアをステートレスになるように設計する必要があります。

ただし、GAE は引き続き仮想サーバーを実行するため、特定のサーバー インスタンス上の複数の HTTP 要求間で変更およびアクセスできる、ある種のグローバルな静的変数を設定できる可能性があります。ほとんどの場合、これに沿って何かを行ったことがあります。

前述のように、後続の HTTP 要求が同じサーバー インスタンスにヒットするという保証や、サーバー インスタンスがいつシャットダウンされるかを制御できないため、この状態は通常は役に立ちません。ただし、たとえば、各サーバー インスタンスが処理するリクエストの平均数を実験したい場合は、おそらくそれが可能です。

于 2012-04-13T18:07:06.633 に答える
3

「無国籍」に関するいくつかのコメント:

  1. HTTP プロトコル自体はステートレスです。つまり、リクエストは相互に依存しません (= あらかじめ定義された順序で呼び出す必要はありません)。

  2. 通常、Web アプリケーションはステートフルです。データを保存し、そのデータに基づいて特定のアクション (ユーザー ログインなど) を強制/制限することで、これを実現します。

  3. データは、データベース、キャッシュ、メモリなど、さまざまな方法で Web サーバーに保存できます。ユーザー データ/状態を保存するための 1 つの標準的な方法は、サーブレット セッションです。

  4. App Engine がステートレスであると言うときは、通常、フロントエンド インスタンスには独自の永続的なストレージ (つまり、書き込み可能なファイル システム) がないという事実に言及しています。フロントエンド インスタンスに状態コードを保存するには、データストア、memcache などの Google API のいずれかを使用する必要があります。

于 2012-04-13T19:45:54.390 に答える