обеспечение сериализации обработки запросов на пользователя в GAE / J - PullRequest
3 голосов
/ 12 июня 2011

Режим Google Appengine по умолчанию состоит в том, что каждый экземпляр работает в однопоточном режиме.Они обрабатывают параллельные запросы, порождая новые экземпляры JVM, если это необходимо.

A новый коммутатор , хотя позволяет appengine обрабатывать несколько запросов параллельно в одном и том же экземпляре.

ЧтоДо сих пор я делал это в регулярно размещаемых веб-приложениях Java, чтобы обеспечить безопасность потоков между запросами одного и того же пользователя о синхронизации в сеансе http (или в значении, сохраненном в сеансе). Spring также делает это (используя флаг synchronizeOnSession).

Это невозможно в GAE, поскольку HttpSession (вместе со всеми переменными, которые он хранит) всегда является новым в каждом запросе http,То есть хеш-код всегда отличается.Так что синхронизация на это не имеет никакого эффекта.Но даже если бы это было возможно, appengine не гарантирует, что два запроса от одного пользователя будут обрабатываться одним и тем же экземпляром (что-то вроде липкого сеанса).

Новый флаг appengine предупреждает, что:

Если вы хотите использовать параллельные запросы, код вашего приложения должен использовать правильную синхронизацию потоков перед включением.

Итак, как я могу гарантировать, что мое приложение будет потокобезопасным в отношении операцийот того же пользователя?Меня больше всего волнуют действия, которые пользователь может выполнять с данными, существующими в его сеансе http.Очевидно, меня волнует только синхронизация запросов одного и того же пользователя в одном и том же экземпляре.

Спасибо

1 Ответ

2 голосов
/ 12 июня 2011

Несколько заметок:

  1. Попробуйте сохранить состояние приложения на стороне клиента, то есть обработайте его с помощью JavaScript. Там вы можете запретить пользователю отправлять несколько запросов одновременно или не в порядке.

  2. Поскольку GAE может запускать несколько экземпляров параллельно на разных серверах, ваши усилия по синхронизации в сеансе будут работать большую часть времени, но не гарантируется, что они будут работать постоянно.

  3. Я полагаю, что вы пытаетесь запретить пользователю переводить свои данные в несогласованное состояние (выполняя действия не по порядку). В конечном счете, единственной точкой синхронизации в GAE являются транзакции хранилища данных. Используйте их для поддержания данных в согласованном состоянии.

...