3

Google appengine のデフォルト モードでは、各インスタンスがシングル スレッド モードで実行されます。必要に応じて、新しい JVM インスタンスを生成することにより、同時要求を処理します。

ただし、新しいスイッチにより、appengine は同じインスタンスで複数のリクエストを並行して処理できます。

同じユーザーのリクエスト間でスレッドの安全性を確保するために、定期的にホストされている Java Web アプリケーションでこれまで行ってきたことは、http セッション (またはセッションに格納された値) で同期することでした。Spring もそれを行います (synchronizeOnSessionフラグを使用)。

これは、GAE では不可能です。なぜなら、HttpSession は (保存されているすべての変数と共に) 各 http 要求で常に新しいからです。つまり、ハッシュコードは常に異なります。そのため、同期しても何の効果もありません。ただし、これが可能であったとしても、appengine は、同じユーザーからの 2 つのリクエストが同じインスタンス (スティッキー セッションなど) によって処理されることを保証しません。

appengine の新しいフラグは、次のことを警告します。

同時リクエストを使用する場合は、有効にする前に、アプリケーション コードで適切なスレッド同期を使用する必要があります。

では、同じユーザーからの操作に関してアプリケーションがスレッド セーフであることを確認するにはどうすればよいでしょうか? 私は主に、ユーザーが http セッションに存在するデータに対して実行できるアクションに関心があります。私は明らかに、同じインスタンスで同じユーザーのリクエストを同期することだけに関心があります。

ありがとう

4

1 に答える 1

2

いくつかのメモ:

  1. クライアント側でアプリケーションの状態を維持してみてください。つまり、javascript で処理してください。そこで、ユーザーが一度に複数のリクエストを送信したり、順不同で送信したりするのを防ぐことができます。

  2. GAE は異なるサーバー上で複数のインスタンスを並行して実行できるため、ほとんどの場合、セッションでの同期は機能しますが、常に機能するとは限りません。

  3. あなたがやろうとしているのは、ユーザーが自分のデータを一貫性のない状態にすることを防ぐことだと思います(アクションを順不同で実行することによって)。最終的に、GAE の唯一の同期ポイントはデータストア トランザクションです。それらを使用して、データを一貫した状態に保ちます。

于 2011-06-12T07:36:48.273 に答える