Недавно мы перенесли наши сервисы машинного обучения с Google Kubernetes Engine (GKE) на Cloud Run. Я дам вам краткий обзор того, что мы сделали, как выглядит наша архитектура и как прошла миграция. Цель этой статьи — поделиться своими знаниями и описать, почему первая итерация не дала желаемого результата.

Во Части 2 мы расскажем, как нам удалось, наконец, снизить стоимость на 50% по сравнению с исходной настройкой и дополнительно сократить время обработки рекомендации с 20 до менее 1 секунды.

Архитектура системы

Работая для Опинари, мы вовлекаем читателей, задавая правильные вопросы в новостных статьях. Как специалисты по обработке и анализу данных, Эктор Отеро Медьеро и я отвечаем за интеграцию наиболее подходящего контексту опроса в новостные статьи.

Представьте, что вы читаете статью на своем любимом новостном сайте о том, должны ли быть ограничения скорости на автомагистралях. Мы стремимся интегрировать опрос в эту статью, задавая вам что-то вроде следующего:

Рекомендовать и интегрировать этот вопрос в эту статью — это успех. Но что на самом деле происходит на заднем плане? Есть много служб, участвующих в отображении этого опроса в вашей новостной статье. Сервисы рекомендаций, на которых мы сосредоточимся, показаны ниже:

Система рекомендаций начинается с URL статьи, для которой следует рекомендовать опрос. Возьмем статью с заголовком:

Петиция об ограничении скорости и запрете на автомобили по воскресеньям поступила в парламент

URL-адрес статьи помещается в очередь Pub/Sub, которая представляет собой очередь, ориентированную на обмен сообщениями, для обработки входящих задач. Служба рекомендаций извлекает новую задачу из очереди для ее обработки. Узнайте больше о pub/sub здесь.

Затем служба рекомендаций организует другие службы, запрашивая их в следующем порядке, одну за другой:

  1. Служба Article-Scraper-Service для очистки текста статьи.
  2. Служба Encoder-Service для кодирования текста в текстовые вложения.
  3. Служба Brand-Safety-Service для классификации того, является ли текст безопасным для интеграции и не содержит ли он описаний трагических событий, таких как смерть, убийство или несчастный случай.

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

До миграции все службы и база данных Redis работали в кластере Kubernetes.

Почему мы захотели мигрировать?

Нашей главной целью, когда мы решили мигрировать, была экономия средств. Мы хотели платить только за те ресурсы, которые использовали. С GKE кластер и сервисы доступны круглые сутки, и вы все время платите. Поскольку ночью в Европе у нас гораздо меньше трафика, мы хотели, чтобы услуги уменьшались, когда они не нужны, и увеличивались, когда в систему поступает много запросов. Наконец, в нашей команде нет специального инженера по данным, поэтому решение должно быть максимально простым в обслуживании. CloudRun кажется хорошим решением для нашего варианта использования.

Что это за облачный забег?

Cloud Run — управляемая бессерверная платформа от Google. Бессерверность означает, что облачный провайдер выделяет машинные ресурсы по вашему требованию, заботясь об управлении серверами. Cloud Run прост в использовании и позволяет развернуть приложение Docker за считанные секунды. Он масштабируется из коробки в соответствии с входящим HTTP-запросом, и вы платите только за использование.

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

Поскольку службы Cloud Run масштабируются с учетом входящих HTTP-запросов, каждая служба должна иметь конечную точку HTTP для приема запросов. Можно легко настроить push-подписки Pub/Sub для обработки запросов. Кроме того, для быстрого масштабирования вверх и вниз выгодно, если сервисы имеют быстрое время запуска.

Новая архитектура — что изменилось?

Самым важным изменением стал переход с подписки по запросу на подписку по запросу. Служба рекомендаций после выполнения одной задачи извлекает новую задачу из очереди публикации/подписки. Теперь очередь отправляет работу рекомендателю всякий раз, когда она поступает, и контейнер рекомендателя в Cloud Run должен ответить в течение определенного периода времени.

Кроме того, мы используем соединители VPC для подключения сервисов Cloud Run к сети VPC. Службы и Redis больше не работают вместе в защищенном кластере. Службы теперь являются независимыми службами Cloud Run, и мы перешли от Redis внутри GKE к Memorystore, службе GCP в памяти для Redis. Memorystore защищен от Интернета с помощью сетей VPC, и для доступа к хранилищу службам необходимо подключаться через коннекторы VPC. Подробнее о настройке здесь.

Как это было (неправильно)?

После миграции у нас есть хорошо масштабируемая система, которая автоматически масштабируется, если поступает больше запросов. Однако служба рекомендаций стала ОЧЕНЬ дорогой, потому что она была организована и, следовательно, ожидала всех других служб. В результате многие экземпляры рекомендательного контейнера работали, но, по сути, ничего не делали, кроме ожидания. Поэтому политика оплаты по факту использования Cloud Run приводит к высокой стоимости этой услуги.

Это не конец истории, только первая итерация. О том, как мы заставили систему работать красиво с помощью Cloud Run и какие улучшения мы сделали по ходу дела, вы можете прочитать в Часть 2.

Краткое содержание

Переход с K8s на CloudRun прост, однако учтите следующее:

  • Наши затраты сначала увеличились за счет перехода на Cloud Run, читайте часть 2.
  • Он лучше подходит для небольших/асинхронных процессов.
  • Возможно, вам потребуется настроить существующие службы.
  • Проблемы с производительностью будут иметь большее влияние.