Google appengine のデフォルト モードでは、各インスタンスがシングル スレッド モードで実行されます。必要に応じて、新しい JVM インスタンスを生成することにより、同時要求を処理します。
ただし、新しいスイッチにより、appengine は同じインスタンスで複数のリクエストを並行して処理できます。
同じユーザーのリクエスト間でスレッドの安全性を確保するために、定期的にホストされている Java Web アプリケーションでこれまで行ってきたことは、http セッション (またはセッションに格納された値) で同期することでした。Spring もそれを行います (synchronizeOnSession
フラグを使用)。
これは、GAE では不可能です。なぜなら、HttpSession は (保存されているすべての変数と共に) 各 http 要求で常に新しいからです。つまり、ハッシュコードは常に異なります。そのため、同期しても何の効果もありません。ただし、これが可能であったとしても、appengine は、同じユーザーからの 2 つのリクエストが同じインスタンス (スティッキー セッションなど) によって処理されることを保証しません。
appengine の新しいフラグは、次のことを警告します。
同時リクエストを使用する場合は、有効にする前に、アプリケーション コードで適切なスレッド同期を使用する必要があります。
では、同じユーザーからの操作に関してアプリケーションがスレッド セーフであることを確認するにはどうすればよいでしょうか? 私は主に、ユーザーが http セッションに存在するデータに対して実行できるアクションに関心があります。私は明らかに、同じインスタンスで同じユーザーのリクエストを同期することだけに関心があります。
ありがとう