Cloud Run - задержка запросов
Я пытаюсь использовать Cloud Run для запуска микросервиса, подключенного к Firestore. Микросервис создает объекты на основе https://s2geometry.io для создания нескольких географических зон с определенными атрибутами и, таким образом, помогает локализовать пользователей для отправки им информации в соответствии с зоной, в которой я их размещаю.
Я использовал Python 3.7 и FastAPI для создания микросервиса и маршрутов для связи с ним.
Микросервис работает без сбоев на моем локальном компьютере и на вычислительных машинах, поскольку большинство моих маршрутов требует менее 150 мс для ответа, когда я их тестирую. Однако при развертывании с помощью Cloud Run у меня возникает проблема с задержкой. Время от времени микросервис очень долго отвечает (до 15 минут), и я не могу точно указать, что именно его вызывает.
Вот снимок экрана, на котором мы видим количество запросов и задержку запросов:
Количество запросов и задержка запроса
Никакой реальной корреляции между задержкой запросов и количеством запросов нет или, по крайней мере, нет тривиальных. Я также посмотрел на использование памяти службой, и использование памяти составляет не более 30%. Однако загрузка ЦП иногда достигает 100%, но не обязательно при медленных запросах.
Наконец, когда я изучил список трассировки и сравнил запросы с высокой задержкой, я заметил следующее различие.
След медленного запроса
След быстрого запроса
Кажется, что быстрые запросы вызывают сами себя, тогда как медленные - нет, и я не знаю почему.
На данный момент у нас не так много пользователей, поэтому я подумал, что это может быть проблема холодного запуска, но медленные запросы не обязательно являются первыми.
Теперь, честно говоря, я не знаю, что здесь происходит и что делает Cloud Run (или что я сделал не так), и мне также довольно сложно найти подробное объяснение того, как на самом деле работает Cloud Run, поэтому, если он у вас есть (кроме Google) Я бы с удовольствием в него погрузился.
Большое спасибо за вашу помощь
1 ответ
После разных экспериментов кажется, что это проблема с холодным запуском. Контейнеры Cloud Run останавливаются через определенное время, если они не используются, и поскольку у нас не было большого трафика, контейнер должен был загружаться каждый раз, когда пользователь хотел получить доступ к приложению.
Решение:
Я создал облачную функцию, которая отправляет запрос в контейнер при запуске, а затем создал задание облачного планировщика, которое запускает функцию каждую минуту.
Заметка:
Если в ваш сервис направляются разные версии, вам необходимо создать задание Cloud Scheduler для каждой версии. Для этого вам необходимо создать URL-адрес (тег) ревизии для каждой направляемой ревизии (в настоящее время бета).