Обработка больших объемов событий в real-time-рекомендательных системах на Go

GolangConf: Technologies

Доклад принят в программу конференции

В настоящий момент Product Owner команды "Core" компании PropellerAds.
Команда занимается разработкой высоконагруженного ядра системы ротации рекламы.
Основная точка приложения усилий — программная реализация алгоритмов рекомендательных систем в real-time-среде.

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

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

Тезисы

Видео

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

Для реализации данной задачи в нашей компании созданы несколько микросервисов на языке Go. Система обрабатывает более 200K запросов в секунду и хранит в памяти Go-процесса около 120 Gb данных. При этом в секунду рассчитываются вероятности конверсии для 25M рекламных предложений.

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

* Чтение большого объема данных из нашей шины событий (kafka).
* Расчет агрегатов событий в различных разрезах (счетчиков) с наименьшими затратами по CPU и memory footprint, и какие структуры данных мы для этого используем.
* Уменьшение contention при обработке событий.