На хабре не нашел много критики по GAE, всё больше положительных отзывов (например тут и тут). Поэтому хочется немного разнообразить положение дел, описав некоторые критические нюансы, мешающие полноценной работе в облаке.
GAE использую относительно недолго, примерно полгода. До недавнего времени это были простые сайты со статическим контентом. Для них GAE подходит идеально — невысокий траффик, который не исчерпывает бесплатные квоты + java. Любое веб приложение html/javascript заливается быстро и удобно с помощью мавена. Пишешь mvn gae:deploy и через минуту твое приложение уже в облаке.
Настало время чуть более активно использовать базу данных для нового проекта и тут начались грабли. Так как приложение автоматически масштабируется, то появляется необходимость синхронизировать данные между инстансами. Для этих целей часто используется база данных плюс кеширование в приложении или внешнем туле (memcache). Однако, при таком подходе, бесплатные квоты по DataStore операциям очень быстро кончаются. В настоящее время, это всего 50000 операций записи и столько же чтения в день. Конечно, при необходимости, квоты можно докупать. Ниже приведена стоимость квот DataStore.
0.10$
100000 операций записи
0.07$
100000 операций чтения
0.01$
100000 small операций
К сожалению, если нужно положить 1 запись в таблицу с двумя индексами, то количество операций записи не 1, а 6. Обновление 1 записи израсходует 9 операций записи. Чтобы было более наглядно, привожу таблицу по расходованию операций при работе с базой данных.
High-Level Operation
Low-Level Operations Required
Прочитать 1 запись
(Entity Get)
1 read
Добавить 1 запись
(New Entity Put)
2 writes + 2 writes per indexed property value + 1 write per composite index value
Обновить 1 запись
(Existing Entity Put)
1 write + 4 writes per modified indexed property value + 2 writes per modified composide index value
Удалить 1 запись
(Entity Delete)
2 writes + 2 writes per indexed property value + 1 write per composite index value
Запросить несколько записей
(Query)
1 read + 1 small per entity retrieved
Запросить только ключи
(Query, keys only)
1 read + 1 small per key retrieved
Создание ключа
(Key allocation)
1 small
Таким образом получается, что даже с учетом оптимизации и кеширования в memcache, в среднем тратится порядка 30 datastore операций на один пользовательский запрос. Иначе говоря, бесплатных квот хватает только на ~1600 пользовательских запросов. Добавляем к пользовательским запросам работу с базой по cron задачам — совсем тяжко становится.
Положение еще усугубляется тем, что в DataStore нет уникальных ключей и при масштабировании системы приходится проверять уникальность записей вручную до или после добавления данных в базу. Хотя для масштабируемых систем это обычное дело, это дополнительно увеличивает нагрузку на базу данных, квоты которой и без того дорого обходятся.
Пока разбирался с ограничениями в GAE, нашел любопытную статью в блоге Carlos Ble — Goodbye Google App Engine и похожий раздел на GAE Cupboard. К известным ограничениям сразу добавилось еще несколько, до которых я ещё не добрался. Сразу скажу, что часть из описанных проблем в GAE уже исправлена, но и немалая их доля осталась:
Запрос не может выполняться больше 30 секунд. Особенно критично для maintenance, например при бекапах или апгрейдах.
Нельзя выполнить запрос вида DELETE FROM tableA WHERE conditionB. Все записи удаляются по-штучно и это стоит кучу денег.
База данных не поддерживает запросы вида «LIKE» — необходима денормализация базы и pagination.
Нельзя join'ить таблицы.
База работает очень медленно.
Поведение базы данных в локальном окружении отличается от поведения в облаке.
Периодические сбои в DataStore и MemCache. Для MemCache это не страшно, а вот потерять данные в базе — критично. С бекапом тоже тяжело — бекап 50000 записей исчерпывает бесплатные квоты для DataStore в сутки, плюс тут ограничение в 30 секунд на операцию. Отдать гуглу 100$ за бекап своей базы? Да легко!
Итого:
GAE идеально подходит для персональных страничек или сайтов визиток (бесплатный и надежный хостинг).
Если нужна база данных хоть немного, стоимость хостинга возрастает с бесплатного до $50/месяц и более.
При наличии большого количества статических страниц, лучше использовать обычный VPS с nginx.
Пока код не сильно завязан на GAE, перехожу на Linode. Потом расскажу что и как.