35
Создание RTB DSP на языке Go Даниил Подольский Qmobi.com

RTB DSP на языке Go: укрощение buzzwords

Embed Size (px)

Citation preview

Page 1: RTB DSP на языке Go: укрощение buzzwords

СозданиеRTB DSPна языке GoДаниил ПодольскийQmobi.com

Page 2: RTB DSP на языке Go: укрощение buzzwords

Немного о Qmobi.com• Компания Qmobi занимается

• интернет-рекламой• продвижением мобильных приложений

• без RTB DSP просто не может• Стек технологий (.Net), до настоящего времени использовавшийся в компании, не подходит под задачу• и это прекрасно - мы свободны в выборе!

Page 3: RTB DSP на языке Go: укрощение buzzwords

Немного о выборе•на самом деле - выбор совсем не широк

• .Net•JVM-экосистема•все_остальное

•нет, это нельзя писать на perl•да, мы проверяли

•из всего_остального мы выбрали Go•да, это произвол

Page 4: RTB DSP на языке Go: укрощение buzzwords

Немного о докладе•никаких цифр и графиков•розовые единороги и радуга повсюду•основная мысль - выбор стал шире:

•Net•JVM-экосистема•Go•все_остальное

Page 5: RTB DSP на языке Go: укрощение buzzwords

С чего все начиналось

Page 6: RTB DSP на языке Go: укрощение buzzwords

Как все продолжалось

Page 7: RTB DSP на языке Go: укрощение buzzwords

Как все начало заканчиваться• 4 часа сборки

• C++

• Описание интерфейсов в терминах наследования

• Запутанная архитектура

• JSON-конфиги, xml-конфиги

• Zookeeper

• ZeroMQ

• Redis

Page 8: RTB DSP на языке Go: укрощение buzzwords

RTBkit все•мы написали

•smaato-коннектор, Bid и Win•bidder agent•ad-server• logger•интеграцию с trading desc (sort of)

Page 9: RTB DSP на языке Go: укрощение buzzwords

RTBkit все•что осталось

• router - неудобный при том•banker

Page 10: RTB DSP на языке Go: укрощение buzzwords

RTBkit все•что осталось

• router - неудобный при том•banker

•так, может быть, переписать и их?

Page 11: RTB DSP на языке Go: укрощение buzzwords

Немного о задаче•1000 пользователей

•по 100 кампаний•по 100 креативов на кампанию•итого - 10 000 000 строк

Page 12: RTB DSP на языке Go: укрощение buzzwords

Немного о задаче•1000 пользователей

•по 100 кампаний•по 100 креативов на кампанию•итого - 10 000 000 строк

•10krps•можно и больше, но не нужно

•мы ограничены бюджетом

Page 13: RTB DSP на языке Go: укрощение buzzwords

Еще о задаче• Задача выглядит прямой как палкаи простой как 3 копейки

• вот креативы

• вот запросы

• матч один к другому, и все получится

• задача выглядит хорошо масштабирующейся

• база креативов обновляется редко

• базе креативов не нужна strong consistency

Page 14: RTB DSP на языке Go: укрощение buzzwords

А теперь - о проблемах•banker - не масштабируется

• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД

Page 15: RTB DSP на языке Go: укрощение buzzwords

А теперь - о проблемах•banker - не масштабируется

• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД

• bidder - это расчет пересечения множеств

• а пересечения множеств - это или сортировка, или полный перебор

Page 16: RTB DSP на языке Go: укрощение buzzwords

А теперь - о проблемах•banker - не масштабируется

• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД

•bidder - это расчет пересечения множеств•а пересечения множеств - это или сортировка, или полный перебор

•а еще bidder - это сортировка выборки•по приоритету•по времени последнего показа•по цене показа•по остатку на счете кампании

Page 17: RTB DSP на языке Go: укрощение buzzwords

И о решениях•нетипичный проект, задачи•или тривиальны•или не имеют решения

Page 18: RTB DSP на языке Go: укрощение buzzwords

Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go

• из нестандартного -OpenRTB протоколСУБД драйвер

Page 19: RTB DSP на языке Go: укрощение buzzwords

Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go

• из нестандартного OpenRTB протоколи СУБД драйвер

• nginx - знамя русского хайлоада - на входе

• просто для обработки таймаута

Page 20: RTB DSP на языке Go: укрощение buzzwords

Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go

• из нестандартного OpenRTB протоколи СУБД драйвер

• nginx - знамя русского хайлоада - на входе

• просто для обработки таймаута

• кеширование креативов и кампаний в памяти

• раз уж они влезают

Page 21: RTB DSP на языке Go: укрощение buzzwords

Об очевидныхтехнических решениях• Geo-таргетинг делается по кодам ISO-3166

• коды получаются из координат с помощью PostGIS

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

• примерно треть запросов не содержит координат

• практически ни один запрос не содержит кодов ISO-3166 - а по стандарту должен!

Page 22: RTB DSP на языке Go: укрощение buzzwords

О спорныхтехнических решениях• MySQL как banker

• прижился со стадии прототипа

• да, на триггерах

• 10krps - это примерно 20k updates per second

• backup есть, failover и balancing нет

• и backup может существенно отставать

Page 23: RTB DSP на языке Go: укрощение buzzwords

О спорныхтехнических решениях• Logger на InfluxDB

• InfluxDB - странная база, но она работает•Она - time series• В нее же пишем метрики для Grafana

Page 24: RTB DSP на языке Go: укрощение buzzwords

О спорныхтехнических решениях• Logger на InfluxDB

• InfluxDB - странная база, но она работает•Она - time series• В нее же пишем метрики для Grafana

•Обычно для логов используется Elastic Search• Но он слишком сильно грузит диски• И даже известно, почему

Page 25: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• Как устроена выборка по таргетингу

• НИКАК!• мы берем случайную запись, и проверяем ее на соответствие• если не подошла - берем еще одну случайную• и так, пока не выйдет время (100ms)

Page 26: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• Как устроена выборка по таргетингу

• НИКАК!• мы берем случайную запись, и проверяем ее на соответствие• если не подошла - берем еще одну случайную• и так, пока не выйдет время (100ms)

• И это работает• и мы можем это доказать

Page 27: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• На самом деле - это не совсем правда• самый нужный таргетинг захардкожен в структуру кеша

• случайная выборка происходит не по всему пространству, а по подмножеству, ограниченномуDevice + OS + version + Geo

Page 28: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• Подлый удар от Go sheduler

• переключение go-routines происходит по IO• это значит - пока мы ползаем по базе, мы не даем другим рутинам работать• пришлось вставитьruntime.Gosched() в цикл

Page 29: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• Приоритетов кампаний ровно два

• и приоритетные просто"дважды изображены на бутылке"

Page 30: RTB DSP на языке Go: укрощение buzzwords

О самому-страшнотехнических решениях• Приоритетов кампаний ровно два

• и приоритетные просто"дважды изображены на бутылке"• прекратите смех!!1

Page 31: RTB DSP на языке Go: укрощение buzzwords

Что дальше• заменить MySQL на CA кластер.

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

Page 32: RTB DSP на языке Go: укрощение buzzwords

Итоги•довольно быстрый результат

• 3 человеко-месяца

Page 33: RTB DSP на языке Go: укрощение buzzwords

Итоги•довольно быстрый результат

• 3 человеко-месяца• высокоэффективный код

• 1 сервер тянет 10krps• уперлись мы в MySQL•MySQL уперся в CPU

Page 34: RTB DSP на языке Go: укрощение buzzwords

Итоги•довольно быстрый результат

• 3 человеко-месяца• высокоэффективный код

• 1 сервер тянет 10krps• уперлись мы в MySQL•MySQL уперся в CPU

• полностью свой проект• не считая MySQL и nginx

Page 35: RTB DSP на языке Go: укрощение buzzwords

Спасибо за внимание

• Вопросы?