Upload
daniel-podolsky
View
844
Download
4
Embed Size (px)
Citation preview
СозданиеRTB DSPна языке GoДаниил ПодольскийQmobi.com
Немного о Qmobi.com• Компания Qmobi занимается
• интернет-рекламой• продвижением мобильных приложений
• без RTB DSP просто не может• Стек технологий (.Net), до настоящего времени использовавшийся в компании, не подходит под задачу• и это прекрасно - мы свободны в выборе!
Немного о выборе•на самом деле - выбор совсем не широк
• .Net•JVM-экосистема•все_остальное
•нет, это нельзя писать на perl•да, мы проверяли
•из всего_остального мы выбрали Go•да, это произвол
Немного о докладе•никаких цифр и графиков•розовые единороги и радуга повсюду•основная мысль - выбор стал шире:
•Net•JVM-экосистема•Go•все_остальное
С чего все начиналось
Как все продолжалось
Как все начало заканчиваться• 4 часа сборки
• C++
• Описание интерфейсов в терминах наследования
• Запутанная архитектура
• JSON-конфиги, xml-конфиги
• Zookeeper
• ZeroMQ
• Redis
RTBkit все•мы написали
•smaato-коннектор, Bid и Win•bidder agent•ad-server• logger•интеграцию с trading desc (sort of)
RTBkit все•что осталось
• router - неудобный при том•banker
RTBkit все•что осталось
• router - неудобный при том•banker
•так, может быть, переписать и их?
Немного о задаче•1000 пользователей
•по 100 кампаний•по 100 креативов на кампанию•итого - 10 000 000 строк
Немного о задаче•1000 пользователей
•по 100 кампаний•по 100 креативов на кампанию•итого - 10 000 000 строк
•10krps•можно и больше, но не нужно
•мы ограничены бюджетом
Еще о задаче• Задача выглядит прямой как палкаи простой как 3 копейки
• вот креативы
• вот запросы
• матч один к другому, и все получится
• задача выглядит хорошо масштабирующейся
• база креативов обновляется редко
• базе креативов не нужна strong consistency
А теперь - о проблемах•banker - не масштабируется
• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД
А теперь - о проблемах•banker - не масштабируется
• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД
• bidder - это расчет пересечения множеств
• а пересечения множеств - это или сортировка, или полный перебор
А теперь - о проблемах•banker - не масштабируется
• чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД
•bidder - это расчет пересечения множеств•а пересечения множеств - это или сортировка, или полный перебор
•а еще bidder - это сортировка выборки•по приоритету•по времени последнего показа•по цене показа•по остатку на счете кампании
И о решениях•нетипичный проект, задачи•или тривиальны•или не имеют решения
Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go
• из нестандартного -OpenRTB протоколСУБД драйвер
Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go
• из нестандартного OpenRTB протоколи СУБД драйвер
• nginx - знамя русского хайлоада - на входе
• просто для обработки таймаута
Об очевидныхтехнических решениях• тривиальный код сетевого взаимодействияна Go
• из нестандартного OpenRTB протоколи СУБД драйвер
• nginx - знамя русского хайлоада - на входе
• просто для обработки таймаута
• кеширование креативов и кампаний в памяти
• раз уж они влезают
Об очевидныхтехнических решениях• Geo-таргетинг делается по кодам ISO-3166
• коды получаются из координат с помощью PostGIS
• Полная база работает недопустимо медленно, пришлось создать свою выборку, только с границами интересующих нас областей
• примерно треть запросов не содержит координат
• практически ни один запрос не содержит кодов ISO-3166 - а по стандарту должен!
О спорныхтехнических решениях• MySQL как banker
• прижился со стадии прототипа
• да, на триггерах
• 10krps - это примерно 20k updates per second
• backup есть, failover и balancing нет
• и backup может существенно отставать
О спорныхтехнических решениях• Logger на InfluxDB
• InfluxDB - странная база, но она работает•Она - time series• В нее же пишем метрики для Grafana
О спорныхтехнических решениях• Logger на InfluxDB
• InfluxDB - странная база, но она работает•Она - time series• В нее же пишем метрики для Grafana
•Обычно для логов используется Elastic Search• Но он слишком сильно грузит диски• И даже известно, почему
О самому-страшнотехнических решениях• Как устроена выборка по таргетингу
• НИКАК!• мы берем случайную запись, и проверяем ее на соответствие• если не подошла - берем еще одну случайную• и так, пока не выйдет время (100ms)
О самому-страшнотехнических решениях• Как устроена выборка по таргетингу
• НИКАК!• мы берем случайную запись, и проверяем ее на соответствие• если не подошла - берем еще одну случайную• и так, пока не выйдет время (100ms)
• И это работает• и мы можем это доказать
О самому-страшнотехнических решениях• На самом деле - это не совсем правда• самый нужный таргетинг захардкожен в структуру кеша
• случайная выборка происходит не по всему пространству, а по подмножеству, ограниченномуDevice + OS + version + Geo
О самому-страшнотехнических решениях• Подлый удар от Go sheduler
• переключение go-routines происходит по IO• это значит - пока мы ползаем по базе, мы не даем другим рутинам работать• пришлось вставитьruntime.Gosched() в цикл
О самому-страшнотехнических решениях• Приоритетов кампаний ровно два
• и приоритетные просто"дважды изображены на бутылке"
О самому-страшнотехнических решениях• Приоритетов кампаний ровно два
• и приоритетные просто"дважды изображены на бутылке"• прекратите смех!!1
Что дальше• заменить MySQL на CA кластер.
•Возможно, придется написать свой• таргетинг по произвольному набору параметров - второй подход к снаряду • анализатор логов - выяснить, что нужно бизнесу от него, и написать соответствующий интерфейс• автоматическая обратная связь - именно для нее все и затевается
Итоги•довольно быстрый результат
• 3 человеко-месяца
Итоги•довольно быстрый результат
• 3 человеко-месяца• высокоэффективный код
• 1 сервер тянет 10krps• уперлись мы в MySQL•MySQL уперся в CPU
Итоги•довольно быстрый результат
• 3 человеко-месяца• высокоэффективный код
• 1 сервер тянет 10krps• уперлись мы в MySQL•MySQL уперся в CPU
• полностью свой проект• не считая MySQL и nginx
Спасибо за внимание
• Вопросы?