GAE Go - «Этот запрос вызвал запуск нового процесса для вашего приложения ...» - PullRequest
9 голосов
/ 06 марта 2012

Я столкнулся с этой проблемой уже во второй раз, и мне интересно, есть ли какое-либо решение этой проблемы. Я использую приложение на Google App Engine, которое использует частое общение с веб-сайтом через HTTP JSON RPC . Похоже, что GAE имеет тенденцию случайным образом отображать подобное сообщение в журналах:

"Этот запрос вызвал запуск нового процесса для вашего приложения, и таким образом вызвал загрузку кода вашего приложения в первый раз. Таким образом, этот запрос может занять больше времени и использовать больше ресурсов процессора, чем обычный запрос для вашей заявки. "

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

Как я могу получить больше информации об этом поведении, как его избежать и предотвратить потерю данных моих приложений Golang в Google App Engine?

EDIT:

Переменные, хранящиеся в ОЗУ, представляют собой небольшие классы строк, байтов, значений типа bool и указателей. Ничего слишком сложного или большого.

Похоже, что Google App Engine "запускает новый процесс" в течение нескольких секунд более интенсивного использования, а этого должно быть недостаточно для закрытия приложения из-за того, что оно не используется. Промежуток времени между загрузкой приложения в GAE, установкой его переменной и созданием нового процесса составляет менее минуты.

Ответы [ 3 ]

13 голосов
/ 06 марта 2012

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

Когда нагрузка увеличивается, GAE создает новый экземпляр, в котором, разумеется, все переменные ОЗУ пусты.

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

4 голосов
/ 06 марта 2012

Вы можете прочитать об экземплярах GAE в их документации здесь, ознакомьтесь с разделом производительности:

http://code.google.com/appengine/kb/java.html

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

Моя рекомендация по поддержанию экземпляра GAE в силе: либо заплатите за сервис Always-On, либо следуйте моим рекомендациям по использованию cron здесь:

http://rwyland.blogspot.com/2012/02/keeping-google-app-engine-gae-instances.html

Я использую то, что я называю «основным графиком» 3, 7, 11-минутной работы cron.

2 голосов
/ 23 апреля 2012

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

...