google app engine что это

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

На хабре не нашел много критики по 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, перехожу на Linode. Потом расскажу что и как.

Источник

Работа с базой данных в Google App Engine/Google Cloud Endpoints на Java: фреймворк Objectify

Однако руководство по созданию API было бы неполным без работы с базой данных.

В этой статье мы рассмотрим фреймворк Objectify для работы с встроенной в GAE базой данных App Engine Datastore.

App Engine Datastore

App Engine Datastore представляет собой нереляционную NoSQL-базу данных (schemaless NoSQL datastore) типа «хранилище ключ-значение» (Key-value database).

Ключ является уникальным идентификатором «объекта» (в App Engine datastore это называется «Entity») в базе данных.

Ключ состоит из трех составляющих:

Kind (тип): который соответствует типу объекта в базе данных (с помощью Objectify мы моделируем kind в виде класса Java, т.е. условно говоря в нашем случае kind означает класс объекта размещенного в базе данных)

Identifier (идентификатор): уникальный идентификатор объекта, который может быть либо строкой (String), и в этом случае он называется name, либо числом (Long) в этом случае он называется Id. Т.е. идентификатор вида «01234» — это name, а вида 01234 — это Id. Идентификатор должен быть уникальным среди объектов одного типа, объекты разного типа могут иметь одинаковый идентификатор, т.е. мы можем иметь объект типа «строка» с идентификатором «01», и объект типа «колонка» с идентификатором «01». Для вновь создаваемого объекта в базе данных идентификатор, если он не задан явным образом, генерируется автоматически.

Parent(группа объектов): объекты в базе могут объединяется в «группы объектов», для этого в parent указывается либо ключ «родительского» объекта, либо таковым является null (по умолчанию) для объектов не включенных в группы.

Объект (Entity)

Объект (Entity) в базе данных имеет свойства (properties) которые могут содержать значения (Value type), их соответствие типам данных Java (Java types)) приведено в таблице:

Читайте также:  ролевая игра как основной вид деятельности характерна для какого возраста
Value type Java type(s) Sort order Notes
Integer short
int
long
java.lang.Short
java.lang.Integer
java.lang.Long
Numeric
Floating-point number float
double
java.lang.Float
java.lang.Double
Numeric 64-bit double precision,
IEEE 754
Boolean boolean
java.lang.Boolean
false or true
Text string (short) java.lang.String Unicode До 1500 bytes

значения больше 1500 bytes выбрасывает исключение IllegalArgumentException

Text string (long) com.google.appengine.api.datastore.Text None До 1 megabyte

Не индексируется

Byte string (short) com.google.appengine.api.datastore.ShortBlob Byte order До 1500 bytes

Значения большие 1500 bytes выбрасывают исключение IllegalArgumentException

Byte string (long) com.google.appengine.api.datastore.Blob None До 1 megabyte

Не индексируется

Date and time java.util.Date Chronological
Geographical point com.google.appengine.api.datastore.GeoPt By latitude,
then longitude
Postal address com.google.appengine.api.datastore.PostalAddress Unicode
Telephone number com.google.appengine.api.datastore.PhoneNumber Unicode
Email address com.google.appengine.api.datastore.Email Unicode
Google Accounts user com.google.appengine.api.users.User Email address
in Unicode order
Instant messaging handle com.google.appengine.api.datastore.IMHandle Unicode
Link com.google.appengine.api.datastore.Link Unicode
Category com.google.appengine.api.datastore.Category Unicode
Rating com.google.appengine.api.datastore.Rating Numeric
Datastore key com.google.appengine.api.datastore.Key
or the referenced object (as a child)
By path elements
(kind, identifier,
kind, identifier. )
До 1500 bytes

Значения большие 1500 bytes выбрасывают исключение IllegalArgumentException

Blobstore key com.google.appengine.api.blobstore.BlobKey Byte order
Embedded entity com.google.appengine.api.datastore.EmbeddedEntity None не индексируется
Null null None

Операции с базой данных

Objectify производит три базовых операции:

save(): сохранить объект в базе данных

delete(): удалить объект из базы данных

load(): загрузить объект или список (List) объектов из базы данных.

Трансакции (Transactions) и группы объектов (Entity Groups)

Для того чтобы объединить объекты в группу «родительский» объект не обязательно должен существовать в базе, достаточно указать ключ объекта. Удаление «родительского объекта» не приводит к удалению «дочерних», они продолжат ссылаться на его ключ.

При этом у каждого «дочернего» объекта может быть только один «родительский» объект. И, поскольку ключ родительского объекта является частью ключа объекта, мы не можем добавлять или убирать его после того как объект создан — ключ не изменяем. Поэтому к использованию «родительского ключа» надо подходить с осторожностью.

Как правило рамках одной трансакции мы можем получить доступ к данным только из одной группы объектов (но существует способ задействовать в одной трансакции несколько групп)
Когда изменяется любой объект в группе для группы меняется отметка времени (timestamp). Отметка времени ставиться для целой группы, и обновляется когда изменяется любой объект в группе.

Когда мы производим трансакцию, то каждая группа объектов которую затрагивает трансакция отмечается как задействованная (enlisted) в данной трансакции. Когда трансакция передана (committed), проверяются все отметки времени групп, задействованных в трансакции. Если любая из отметок времени изменилась (поскольку другая трансакция в это время изменила объект(ы) в группе) то вся трансакция отменяется и выбрасывается исключение ConcurrentModificationException. Подробнее см. github.com/objectify/objectify/wiki/Concepts#optimistic-concurrency
Objectify обрабатывает такого рода исключения и повторяет трансакцию. Поэтому трансакции должны быть идемпотентны (idempotent), т.е. мы должны иметь возможность повторить трансакцию любое количество раз и получить тот же самый результат.

Подключение Objectify в проект

Для использования фреймворка нам понадобиться добавить в проект objectify.jar и guava.jar.
Objectify есть в репозитории Maven, нам достаточно добавить в pom.xml:

— objectify.jar и guava.jar будут добавлены в проект.
Objectify использует фильтр который надо прописать в WEB-INF/web.xml:

Создадим класс UserData, который будет моделировать объект (Entity) в базе данных:

Далее нам следует создать класс в котором зарегистрируем классы созданные для описания объектов в базе данных, и который будет содержать метод выдающий сервисный объект Objectify (Objectify service object), методы которого мы будет использовать для взаимодействия с базой данных. Назовем его OfyService:

Теперь создадим API (назовем файл UserDataAPI.java):

Теперь по адресу .appspot.com/_ah/api/explorer мы можем с помощью веб-интерфейса протестировать API добавляя, удаляя и загружая объекты из базы данных.

В консоли разработчика по адресу console.developers.google.com/datastore/entities/query, выбрав соответствующий проект, мы получаем доступ в веб-интерфейсу позволяющему работать с базой данных, в том числе создавать, удалять, сортировать объекты:

Источник

Google AppEngine с самого начала: Модель

В предыдущей статье мы выяснили, что такое Google AppEngine, что с ним можно делать, и создали самое простое и примитивное приложение для GAE — helloworld с минимальной поддержкой аутентификации пользователей. Попробуем расширить это приложение, рассмотрев, попутно, возможности Google AppEngine.

Структура и архитектура

Наше предыдущее приложение было предельно простым, и, как таковое, ни в какой архитектуре не нуждалось. Теперь мы ставим перед собой более сложную и более реальную задачу — соответственно, нам следует подумать о том, что будет, когда приложение начнет расти. Разумеется, наша задача выдумана и для нее никакой архитектуры тоже не требуется, но для примера попробуем все сделать «по науке».

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

Модель

В нашем приложении модель хранения данных будет совсем несложной, однако, как мне кажется, этого будет вполне достаточно чтобы проиллюстрировать возможности GAE Datastore. Допустим, нам нужно хранить информацию о пользователе, а именно — его идентификатор, дату и время последнего визита и количество визитов. На языке GAE Datastore это будет выглядеть вот так:

Это была вторая часть из цикла статей про AppEngine. В следующих частях мы доберемся до вкусного — собственно написание контроллера и представления. Жду ваших комментариев, предложений и вопросов.

Источник

Как не платить за Java хостинг или быстрый старт с Google App Engine

Все мы хоть когда-нибудь писали приложения, облегчающие жизнь. Не на заказ, а просто для себя. Записные книжки, программки учета финансов, набор карточек для изучения иностранного языка — да мало ли в жизни хороших идей? И вот было бы здорово, иметь доступ к этой программке не только со своего компьютера, но и с рабочего! А то и поделиться с друзьями своей замечательной программкой!

Все отлично, если вы, скажем, PHP программист — дешевых и даже бесплатных хостингов море.

А что если вы программист Java? Готовые Tomcat хостинги недешевы, а если у вас еще и несколько таких программок, то желание поделиться ими с друзьями выльется в копеечку.

Google нам поможет.

Для следующего рецепта нам понадобится:

Запускаем Idea, выбираем Ctrl-Alt-S > Plugins. Ищем Cloud Code by Google Cloud

Устанавливаем, переоткрываем Idea

Если проект у вас новый, то просто при создании проекта выбираем поддержку Google App Engine Standard (почему стандард? Потому что есть еще flexible, но его бесплатного не бывает, и в целом он дороже).

Если же программка у вас уже написана, то идем в Tools > Cloud Code > App Engine > Add App Engine support > Google App Engine Standard.

Далее мы хотели бы протестировать приложение на нашем компьютере.

Для этого нужно скачать и установить Google Cloud SDK. Вообще-то Idea может сама управлять Google Cloud SDK — скачивать и устанавливать последнюю версию, прописывать все системные переменные, и т.д. Для этого в Settings > Other Settings > Cloud Code > Cloud SDK нужно выбрать «Allow the plugin to manage and install the Cloud SDK». Но мой выбор был скачать и установить вручную.

Затем нам нужно выбрать, что именно будет заливаться на облако (или отлаживаться локально). То есть создать артифакт. Идем Ctrl-Alt-Shift-S > Artifacts > + > Web Application Exploded и выбираем какие именно модули пойдут в наше приложение

Продолжаем с настройкой отладки на localhost.

Добавляем новую Run-Debug Configuration. Шаблон выбираем Google App Engine Standard Local Server. И единственную настройку, которую нужно поменять, это Artifact to deploy — выбрать артифакт, созданный на предыдущем шаге. Если выпадающий список пустой, то либо вы забыли создать артифакт для вашего приложения, либо его тип не Web Application Exploded, а какой-то другой. Еще можно поменять порт. Если у вас другие приложения крутятся на 8080, то cloud приложения можно отлаживать, скажем, на 8888.

Сохраняем, запускаем. Приложение появится в вашем браузере по ссылке localhost:8080 (или 8888). Если программа наткнется на breakpoint, то Idea сама активизируется и вылезет поверх всех остальных окон.

Кстати, breakpoint-ы можно ставить не только на ваших Java классах (сервлетах и прочей серверной части), но и на jsp страницах. Тогда отладка остановится каждый раз, когда браузер запрашивает эту страницу

Отлично! Локально все работает, пора заливать на сервер!

При активации триала, Google попросит о вас все данные — имя, адрес, телефон и номер кредитной или дебетовой карточки. Причем в информационном окошке они заверяют, что ни копейки с карточки не снимут, если только вы сами вручную не подпишетесь на платный аккаунт. Объясняют это проверкой, что вы не робот. На самом деле это сделано, чтобы вам легче было потом подписаться на платные услуги. Если вы решили купить услугу, а тут Google просит ввести номер кредитной карты, вы три раза подумаете: «А нужна ли мне эта услуга?». А если данные кредитной карты уже есть, то и покупка проходит легче — нажал кнопку, подтвердил — и вот, ты уже подписан!

Но это все лирика. Далее нам нужно создать GCP проект. Проект — это не обязательно отдельная программка. Вы можете раздавать сотни программок с одного и того же проекта. Проект в GCP — это скорее направление, сфера работы. На картинке выше проект называется API Project

Возвращаемся в Idea. Снова идем в Run/Debug Configurations, но на этот раз шаблон выбираем Google App Engine Deployment. Здесь настроек вообще по-минимуму. Нужно выбрать только артифакт в строке Deployment и созданный на предыдущем шаге GCP проект. Если вы делаете это в первый раз, то Idea пропросит вас зайти в ваш Google аккаунт.

Казалось бы все? А вот и нет. Дело в том, что App Engine ассоциирует ваше приложение с виртуальным сервером. И этот сервер должен находиться на том или ином физическом сервере Google — так называемой зоне. Всего у Google 20 регионов и 61 зона. Обычно лучше всего выбирать зону, наиболее близкую к вашим клиентам — ссылки внутри зоны открываются гораздо быстрее, чем ссылки между зонами

После того, как все настроено, можно запускать заливку приложения на сервер. Формально, нам нужно бы еще создать файл app.yaml с параметрами для App Engine. По факту же плагин Cloud Tools облегчает нам эту задачу, и генерирует страндартный app.yaml автоматически.

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

Источник

Google App Engine *

Платформа для размещения приложений

Google Chrome: Быть или…

Эксперт в области цифровой безопасности Зак Доффман(Zak Doffman), пишущий для Forbes, снова бьет тревогу о том, что Google задерживает важное обновление, повышающее конфиденциальность в браузере Chrome. Новая попытка Google лишь ухудшила ситуацию. Подробности читайте в статье.

Новости

Коротко и ясно: размещаем фронт Angular 11, бэк Spring Boot Java 11 и mySQL DB на Google App Engine

Однажды мне понадобилось разместить учебный проект на Google App Engine. Зачем? Почему именно там? Можно обсудить позже. Сейчас речь о другом.

Да, в сети есть куча инфы на эту тему, включая гугловскую документацию, но она разрозненная, а годного четкого мануала, содержащего шаги для деплоя всех трех составляющих, не нашлось.

Так появился этот гид (проверено, по состоянию на май 2021-го мин нет работает.

Как использовать GraphQL Federation для инкрементальной миграции с монолита (Python) на микросервисы (Go)

Или как поменять фундамент старого дома, чтобы он не обвалился

Лет 10 назад мы выбрали 2-ю версию Python для разработки нашей обучающей платформы с монолитной архитектурой. Но с тех пор индустрия существенно изменилась. Python 2 был официально похоронен 1 января 2020 года. В предыдущей статье мы объясняли, почему решили отказаться от миграции на Python 3.

Каждый месяц нашей платформой пользуются миллионы людей.

Мы пошли на определённый риск, когда решили переписать наш бэкенд на Go и изменить архитектуру.

Язык Go мы выбрали по нескольким причинам:

Твоя первая игра на Godot Engine

Здравствуй, в данной статье я хочу в максимально сжатой форме познакомить тебя с основами создания простых 2d платформеров на движке Godot. Иногда мы будем останавливаться на некоторых важных моментах, а иногда пропускать ненужную тебе на начальном уровне информацию. Надеюсь из этой статьи ты сможешь извлечь максимум пользы. Приятного прочтения!

Google Apps Script: переносим расписание из таблицы в календарь

Для кого предназначена данная статья

Что понадобится

Книга «Site Reliability Workbook: практическое применение»

CI TeamCity — Автоматизация build процессов Android и UI тестирования

В этой статье предлагаю Вашему вниманию инструкцию по установке и настройке TeamCity для автоматизации сборки и тестирования Android проектов под Windows.

Также буду уделять внимание особенностям настройки environment’а под Android проект (которые находил в процессе исследования) и различного рода вещам, которые могут помочь облегчить жизнь начинающему тестировщику и разработчику.

При обновлении кода проекта должно происходить:

Источник

Читайте также:  earl beardsley код что это
Сказочный портал