Google App Engine и High load

Гаджет «Евровидение 2009», который мы, Sterno.ru, сделали для компании Google, оказался отличным опытом в тестировании App Engine и проверки того, на что способна эта технология. Теперь мы гораздо лучше понимаем, как работает «Движок приложений» при высоких нагрузках. Эта статья описывает сильные и слабые стороны Google App Engine, а также подводные камни, с которыми разработчики могут столкнуться в ходе ее использования.

Слабые стороны:


1. Ограничение CPU_ms на запрос и на страницу

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

2. Ограничение на общее количество запросов в день

В день разрешено около миллиона запросов к сервису, включая запросы к картинкам и другим ресурсам. При больших нагрузках достичь этого числа очень легко. Главная трудность состоит в том, что этот ресурс нельзя купить! Даже при включенном биллинге такие запросы не будут учитываться как платные, и при достижении все того же миллиона приложение перестанет работать. Чтобы избежать этого, нам пришлось переносить файлы для баннеров на сервис хранения файлов Amazon S3.

3. Ограничение на количество запросов в секунду

При интенсивности более 500 запросов в секунду приложение перестает работать. В обычных ситуациях достичь столь высокой нагрузки непросто. В случае с гаджетом Евровидения это получилось из-за рекламных баннеров. Такая проблема может появиться, если страница с вашим сервисом рекламируется на популярных сетевых ресурсах — главной странице Yahoo!, Slashdot или Digg.

Tips & Tricks:


1. Кешируем ВСЁ!

Все, что отдается на запросы пользователей, должно браться напрямую из memcache. Чтобы полностью избежать проблем, лучше создавать cron’ы, которые будут обновлять кеш по расписанию. Тогда даже редкие запросы пользователей не будут требовать обращения к базе данных и производить дополнительные вычисления. Так мы закрываем слабую сторону номер 1.

2. По максимум переносим статический контент на внешние сервера.

Все картинки, CSS, Javascript лучше залить на Google Code и отдавать пользователям непосредственно с него. От нашего приложения пользователи будут получать только закешированный html, а все остальное запросы уже не будут нагружать его. Этим мы закрываем вторую и третью слабую сторону.

3. Включаем биллинг, даже если он не нужен.

Как уже было сказано, бесплатных лимитов App Engine хватает, если приложение хорошо оптимизировать. Для гаджета Евровидения при нагрузке до 300 запросов в секунду за все время было снято 5 центов. Да и то лишь в день финала, когда, понятное дело, интерес пользователей подскочил.

Главный же плюс биллинга (его включение разрешает App Engine взимать деньги за перерасход лимитов) состоит в том, что бесплатные ресурсы все равно остаются. А вот ресурсы, за которые нельзя платить, увеличат свои лимиты в 50 раз! Я совершенно случайно заметил, что после включения биллинга для гаджета Евровидения лимит на количество запросов в день вырос с миллиона до 50 миллионов :)

4. Не храним пользовательские данные в приложении.

Если сохранять пользовательские настройки и профили в БД, то при больших нагрузках придется обновлять кеш слишком активно, поскольку пользователи будут очень часто сохранять свои данные в БД. Ясно, что социальную сеть таким образом не построить.
Для полноценной работы с пользователями и их данными необходимо использовать Google Friend Connect. Он очень просто подключается к любому сайту, дает полноценную авторизацию через Google Account, Yahoo! или OpenID. После этого все пользовательские данные хранятся непосредственно на серверах Google и не затрагивают наше приложение в части, касающейся социальных сетей (френдование, комментарии, рейтинги и т.д.). Вообще, FriendConnect – потрясающий сервис, который позволяет с легкостью подключать мощные социальные функции практически к любому сайту. Из минусов – дает дополнительную нагрузку на браузер (в связи с использованием JavaScipt) и слегка увеличивает трафик при начальной загрузке. Впрочем, в дальнейшем все скрипты кешируются.

Резюме:



На App Engine можно сделать практически что угодно, если уметь ее готовить :)
При этом даже для нагруженного сайта довольно сложно превзойти бесплатные лимиты (если правильно работать с ним), и даже при их превышении плата невысока. Это гораздо выгоднее, чем использовать аналогичные сервисы от Amazon, где за каждый день использования необходимо платить.

Любое приложение нужно достаточно жестоко оптимизировать, что увеличивает время разработки, к сожалению. В принципе, это требование справедливо для любых сайтов, но в случае с App Engine оптимизация необходима вдвойне!.. Конечно, это очень сильно зависит от вида проекта. Если интерактивности на сайте немного, то ситуацию со скоростью работы спасет кеширование на самом верхнем уровне (отдача сгенерированного html). Однако далеко не всегда проблему производительности можно решить так просто.

P.S. Мы разместили на Хабре копию вот этой заметки Евгения Демченко, так как думаем, что она может быть интересна не только читателям GoogleApps.ru.
+57
25 июня 2009, 18:58
83
baluev 22,3

комментарии (21)

+4
barbuza #
а google code не обижается когда на него статику выносят?
+3
sunnybear #
неа :)
0
barbuza #
отлично, у меня была мысль так сделать, но были опасения
+1
Vertex #
Google в опасности… :)
0
bezi #
А как потом достучаться на гугл код за статикой, по прямому линку?
0
Vertex #
$content = get «Дядя Google, дайте статику...»;
PS: шутко :)
+1
sse #
А в какую сумму вам стали затраты на content network от Amazon S3, если не секрет?
+2
mrskam #
Но вообще насчет 500req/sec можно с командой AppEngine поговорить, если проект достойный и работает, то они могут лимиты и расширить, насколько я понял общаясь с разработчиками в irc#appengine
+5
cre8or #
Ещё в тему оптимизации, Google недавно запустил сайт Let's make the web faster
code.google.com/speed/articles/
+1
Snowindy #
Какой язык программирования вы использовали для Вашего сервиса?
–3
z_z #
очевидно — питон, java ещё не родилась
+6
Snowindy #
+3
z_z #
Она до сих пор ранный превьев — под этим я имел ввиду не родилась.
Если ты на unstable/без суппорта языке делаешь виджет для гугла — ты упоротый наркоман
0
darkk #
300 запросов в секунду и 1 гиг трафика в день на бесплатных лимитах как-то у меня в уме не вяжутся…
0
deniszh #
Прошу прощения, немного не понятно как совместить — «Даже при включенном биллинге такие запросы не будут учитываться как платные, и при достижении все того же миллиона приложение перестанет работать.»
с
«Я совершенно случайно заметил, что после включения биллинга для гаджета Евровидения лимит на количество запросов в день вырос с миллиона до 50 миллионов :)»
Так 1 млн запросов в сутки там или 50 млн?
0
Self_Perfection #
Так в том-то весь и прикол, что если биллинг выключен, то лимит 1,3млн., а при включённом биллинге (просто включённом, расходы могут быть 0), лимит 43млн.
пруфлинк
0
littlepea #
Именно! Это потому что количество запросов — это небиллинговый ресурс. Бесплатные лимиты для биллинговых ресурсов (CPU, Bandwidth) не меняются при включении биллинга.
0
deniszh #
Ага, ясно. Просто смутила фраза «Даже при включенном биллинге… при достижении все того же миллиона приложение перестанет работать.»
0
akakunin #
Огромное спасибо!
Очень полезно было почитать о реальном использовании GAE при высоких нагрузках.
Впечятляет возможность укладываться в бесплатный лимит даже при 300 запросах в секунду!
+1
DmitryKoterov #
Поправьте меня, если я что-то не так понял. Но в соответствии с Tip #1, если у Вас все страницы полностью кэшируются «кронами» и отдаются, фактически, как статика, то число 300 запросов в секунду (да и 3000 тоже) не выглядит таким уж большим. В этой связи вопрос: какой же плюс тогда в использовании App Engine, если ту же самую задачу может выполнить даже один сервер в ДЦ с хорошим каналом?
0
ivanrt #
Может быть дело в цене? Сервер в ДЦ стоит дороже чем 5 центов?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.