{"id":14276,"url":"\/distributions\/14276\/click?bit=1&hash=721b78297d313f451e61a17537482715c74771bae8c8ce438ed30c5ac3bb4196","title":"\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0435\u0437 \u0431\u0438\u0440\u0436\u0438","buttonText":"","imageUuid":""}

Кейс смены языка с PHP на GO: сеть экономит 21 000$ в год на системе управления рекламой

Сеть отвечает за показатели рекламы сервиса с развлекательным контентом, для управления использует систему Orbitsoft. Со временем нагрузка на систему увеличилась и производительность снизилась. Чтобы решить эту проблему, мы сменили язык с PHP на Go. Рассказываем, что из этого вышло.

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

Рост показов с 30 млн в сутки до 800 млн

Сеть отвечает за эффективность рекламы, которую показывает сервис с развлекательным контентом. Мы работаем с ней 11 лет.

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

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

Нагрузка на систему постоянно растет. Когда мы только стартовали, у сервиса было от 20 до 30 млн рекламы в сутки, через год — 100 млн, а в начале 2021 года — 800 млн. Чтобы обеспечивать максимальную работоспособность системы, мы регулярно обновляем процессы, внутренние решения и все, что помогает сети и сервису больше зарабатывать на рекламе.

Проблема: ограничение языка PHP и высокая стоимость обслуживания системы

До 2020 года система для управления рекламой работала на языке PHP 5.6. Мы выбрали PHP для экономии ресурсов заказчиков. Например, стоимость разработки и услуг специалистов для PHP ниже, чем для Javа и C++. Доработка системы на этом языке требует меньше времени, чем на том же Javа.

Дорогое обслуживание. Какое-то время система справлялась с задачами, но с ростом нагрузки на нее появились проблемы. Первая — обслуживание стало дороже и сложнее.

Критичных недостатков в системе не было, но мы видели, что можем повысить производительность и снизить расходы, поэтому стали искать решение

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

Допустим, рекламный баннер расположен вверху страницы. Если система для управления рекламой медленно отвечает, на сайте не сразу появится баннер. И пока система реагирует, пользователь проскроллит страницу и уйдет без рекламы.

Формально рекламу показали, поэтому рекламодатель должен платить. На деле он платит за воздух, а такое никому не нравится.

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

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

Технический блок: показатели системы на PHP

6 серверов, без учета хранилищ.

Потребление в пиковые часы: CPU — на уровне 75%, RAM — 90%.

Отклик за 250 мс.

Конфигурация серверов: Dual Hexa-core Xeon E5−2620 v3 2.4 GHz 48.00 GB RAM 2x SSD 256 GB.

Решение: перейти с языка PHP на Go

За 11 лет работы мы максимально оптимизировали систему, поэтому единственным способом увеличить производительность было сменить язык. Мы рассматривали Go и Java, в работе с обоими языками у нас есть опыт и знания, но остановились на Go. По нашей оценке, так выгоднее и проще для заказчика.

Мы проанализировали особенности языков и выбрали Go: он поможет увеличить производительность, при этом заказчик будет меньше платить за обслуживание системы

Кроме смены платформы мы реализовали еще несколько изменений:

  • отказались от монолитного приложения и перешли к микросервисной архитектуре;
  • внедрили полноценный CI/CD;
  • обеспечили высокое покрытие кода unit и интеграционными тестами;
  • разработали скрипты для автоматического развертывания обновлений.

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

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

Проект занял 8 месяцев

Результаты: сократили расходы заказчика и ускорили отклик

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

Мы достигли всех целей, которые запланировали

Проект занял 8 месяцев. За это время мы решали текущие задачи заказчика как постоянная внешняя команда и полностью перестроили систему.

Технический блок проекта

Технологии:

— язык Go 1.13;

— протокол взаимодействия сервисов: GRPC;

— Service Discovery: Consul;

— сбор метрик и мониторинг: Prometheus;

— CI/CD: Bamboo;

— развертывание: Ansible.

Влияние смены языка:

После того как мы переписали все компоненты сервера на Go, показатели нагрузки упали до значений:

— CPU — 30%;

— RAM — 40%.

Что еще изменили кроме языка:

— отказались от монолитного приложения и перешли к микросервисной архитектуре;

— внедрили полноценный CI/CD;

— обеспечили высокое покрытие кода unit и интеграционными тестами;

— разработали скрипты для автоматического развертывания обновлений.

Поделитесь опытом: приходилось ли вам менять язык на проекте?

Дмитрий Михеев, Ведущий разработчик Orbitsoft
0
Комментарии
-3 комментариев
Раскрывать всегда