Движок приложений Google — первый запрос выполняется медленно

#php #google-app-engine #amp-html

# #php #google-app-engine #amp-html

Вопрос:

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

Это мой случай: у меня есть проект AMP (https://amp.dev /) веб-сайта электронной коммерции. Поэтому у меня нет никакого статического URL-адреса, по которому я мог бы настроить запрос на прогрев, который рекомендует Google App Engine. URL-адрес такой: amp.store/product/{productname} , поэтому {productname} он динамический, у меня более 1000 продуктов, и я не могу отправить запрос на этот URL-адрес, чтобы мой экземпляр всегда был в рабочем состоянии.

app.yaml:

 runtime: php55
api_version: 1
service: amp-page

handlers:
- url: .*
  script: main.php

skip_files:....
 

Когда я пытаюсь PageSpeed Insights из Google, я получаю эту ошибку с первой попытки:

Маяк вернул ошибку: ERRORED_DOCUMENT_REQUEST. Lighthouse не удалось надежно загрузить запрошенную страницу. Убедитесь, что вы тестируете правильный URL-адрес и что сервер правильно отвечает на все запросы. (Код состояния: 500)

Теперь, когда я пытаюсь снова сразу после того, как я часто получаю 84/100 (мобильный) 99/100 (рабочий стол).

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

Спасибо!

введите описание изображения здесь

Ответ №1:

Чтобы поддерживать хотя бы один запущенный экземпляр (даже при отсутствии трафика), вы хотите установить для элемента app.yaml масштабирования min_instances значение 1 :

min_instances

Необязательно. Минимальное количество экземпляров, которые App Engine должен создать для этой версии модуля. Эти экземпляры обслуживают трафик при поступлении запросов и продолжают обслуживать трафик, даже когда запускаются дополнительные экземпляры, необходимые для обработки трафика.

Укажите значение от 0 до 1000. Вы можете установить для параметра значение 0, чтобы разрешить масштабирование до 0 экземпляров для снижения затрат, когда запросы не обслуживаются. Обратите внимание, что с вас взимается плата за указанное количество экземпляров, независимо от того, получают они трафик или нет.

Важно: если вы используете appcfg из App Engine SDK для развертывания PHP, вы не сможете использовать этот параметр в своем app.yaml. Вместо этого установите параметр, как описано в разделе Настройка параметров автоматического масштабирования в обозревателе API или с помощью API администратора App Engine.

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

Примечание: вы также можете настроить запросы на прогрев (создание их URL-адреса является частью этого, это не произвольный статический URL-адрес), чтобы еще больше снизить вероятность того, что запросы пользователей станут запросами на загрузку. Вы не можете полностью их устранить — экземпляры не живут вечно, а запросы на прогрев не эффективны на 100%, это просто лучшее решение.

Комментарии:

1. Это тоже хорошая заметка. В вопросе явно не указано automatic_scaling , и это подразумевается только для F1 экземпляров, поэтому я предположил basic_scaling , что у которого есть только опция max.

2. Я предположил автоматическое масштабирование (по умолчанию), поскольку в файле app.yaml не отображалась конфигурация масштабирования.

3. Кроме того, посмотрите на другие параметры, такие как min_pending_latency , который намеренно установлен на 500 мс для бесплатных приложений, говорится в официальном справочном документе app.yaml.

Ответ №2:

Одним из вариантов было бы создать задание cron через ваш cron.файл yaml, который будет запрашивать известную страницу каждые X минут, чтобы гарантировать, что у вас всегда работает один экземпляр.

Создайте в своем приложении единый обработчик, который выполняет php-скрипт и возвращает какой-то результат. Что-то, что не является тяжелым для базы данных. Может быть таким же простым, как эхо «ок»;

Комментарии:

1. проблема, с которой я столкнулся, не помогла бы с отправкой запроса на сервер. Потому что, если я выполняю CRON на ProductA, тогда ProductB займет много времени, как показано выше. Продукт ответит быстро, потому что он был отправлен запросом. Вы можете видеть это по этим 2 ссылкам выше для тестового URL. Если вы посетите ProductA, а затем ProductB, это займет столько же времени

2. Вы уверены, что проблема в масштабировании App Engine? Проблема, которую вы описываете, больше похожа на симптом кэша запросов вашей базы данных. Проверьте страницу экземпляров и посмотрите, запущен ли у вас экземпляр. Если вы делаете, и запрос все еще медленный, то масштабирование не является проблемой.

3. Вы можете использовать панель мониторинга консоли, чтобы увидеть количество запущенных экземпляров с течением времени. В выводе журнала также будет указано, что «Этот запрос вызвал запуск нового процесса для вашего приложения» для холодного запуска.

4. Спасибо @JeffDeskins проблема заключалась не в масштабировании, а в самом API, и поэтому он использует кэширование для запросов к БД (memcache). Только что заметил, что мое приложение работает медленно из-за API:(. Спасибо за разъяснения.

5. @AliDurrani так это был мой комментарий под этим ответом? Рад помочь! Удачи