В GAE есть ли способ заставить экземпляр обслуживать только 1 сеанс?
Я создаю многофункциональное приложение на GAE, используя RIA Suite от Canoo. Этот пакет разделяет компоненты Java Swing на части на стороне сервера и на стороне клиента. На сервере это выглядит как "настольное" Java-приложение. Клиент хранит собственную карту между этими половинами. Когда GAE запускает новый экземпляр, клиентские части об этом не знают - если следующий отправляемый ими запрос направляется в неправильный экземпляр, происходят плохие вещи.
Я полагаю, что смог бы обойти эту проблему, если бы сделал одну из двух вещей:
- Вынудил экземпляр GAE обслуживать ровно один сеанс HTTP.
- Направляет каждый HTTP-запрос на конкретный экземпляр GAE.
Мой вопрос заключается в том, можно ли сделать что-либо из этого в среде GAE?
2 ответа
Ни один из этих двух вариантов не решит вашу проблему, потому что экземпляр App Engine может умереть и быть заменен в любой момент.
Если вы можете сохранить состояние своей "половины" на стороне сервера в хранилище данных, вы можете загрузить его, когда запрос попадет в "неправильный" экземпляр, но это, вероятно, не очень эффективное решение.
Возможно, вам лучше использовать экземпляр Compute Engine.
Я согласен, что ни один из этих двух вариантов не будет работать для вас. Смысл вашего текущего проекта в том, что вы храните состояние в памяти для экземпляра, который не будет работать с GAE (или любой распределенной системой с автоматическим масштабированием). Вы должны поместить любое состояние в какое-то распределенное хранилище данных, будь то memcache (который является энергозависимым), хранилище данных или cloudSQL.
GAE/J имеет встроенную поддержку сеансов Java, состояние сеанса сохраняется в хранилище данных при выполнении запросов, поэтому оно действительно в любом случае. Чтобы это работало, все, что хранится в вашем сеансе, должно быть сериализуемым.
Вы можете включить это, следуя этим инструкциям.
В противном случае вы можете самостоятельно управлять состоянием сервера в хранилище данных, ускоренном с помощью memcache, и связывать его с "сеансом" с cookie. Если вы пойдете по этому пути, убедитесь, что понимаете последствия возможной согласованности в хранилище данных GAE.