Так ли хорош Google App Engine?

в 6:26, , рубрики: gae, google app engine, java, Migration, scalability, Блог компании Luxoft, Облачные вычисления, метки: , , ,

На хабре не нашел много критики по 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 уже исправлена, но и немалая их доля осталась:

  1. Запрос не может выполняться больше 30 секунд. Особенно критично для maintenance, например при бекапах или апгрейдах.
  2. Нельзя выполнить запрос вида DELETE FROM tableA WHERE conditionB. Все записи удаляются по-штучно и это стоит кучу денег.
  3. База данных не поддерживает запросы вида «LIKE» — необходима денормализация базы и pagination.
  4. Нельзя join'ить таблицы.
  5. База работает очень медленно.
  6. Поведение базы данных в локальном окружении отличается от поведения в облаке.
  7. Периодические сбои в DataStore и MemCache. Для MemCache это не страшно, а вот потерять данные в базе — критично. С бекапом тоже тяжело — бекап 50000 записей исчерпывает бесплатные квоты для DataStore в сутки, плюс тут ограничение в 30 секунд на операцию. Отдать гуглу 100$ за бекап своей базы? Да легко!

Итого:

  • GAE идеально подходит для персональных страничек или сайтов визиток (бесплатный и надежный хостинг).
  • Если нужна база данных хоть немного, стоимость хостинга возрастает с бесплатного до $50/месяц и более.
  • При наличии большого количества статических страниц, лучше использовать обычный VPS с nginx.

Пока код не сильно завязан на GAE, перехожу на Linode. Потом расскажу что и как.

Автор: Melnosta

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js