SlideShare a Scribd company logo
Создание

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
Спасибо за внимание
• Вопросы?

More Related Content

PPTX
Бинарные (файловые) хранилища- страшная сказка с мрачным концом
PDF
PDF
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
PDF
My talk on HBase ops engineering at TBD Jun 2016
PDF
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
PPTX
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
PPTX
Спасение 6 миллионов файлов в условиях полного Хецнера
PDF
Tk conf daniel-podolsky-sqlvsnosql
Бинарные (файловые) хранилища- страшная сказка с мрачным концом
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
My talk on HBase ops engineering at TBD Jun 2016
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
101 способ приготовления RabbitMQ и немного о pipeline архитектуре / Филонов ...
Спасение 6 миллионов файлов в условиях полного Хецнера
Tk conf daniel-podolsky-sqlvsnosql

What's hot (19)

PDF
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
PPTX
Организация надежного резервного копирования веб-проекта. Практика и подводны...
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
PDF
My talk at YouCon Saratov 2016
PPTX
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
PDF
My talk at Highload++ 2015
PPTX
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
PDF
My talk on LeoFS, Highload++ 2014
PDF
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
PPTX
неприятная правда про язык go
PDF
Cоциальный граф "Одноклассников" в myTarget
PPTX
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
PPTX
Тестируем производительность распределённых систем, Александр Киров (Parallels)
PPTX
Why we did not choose Hadoop
PDF
NoSQL — неспроста ли это "ЖЖЖ"?
PPTX
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
PPTX
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
PPTX
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Всему своё время / Роман Ивлиев (Банки.ру)
My talk at YouCon Saratov 2016
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
My talk at Highload++ 2015
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
My talk on LeoFS, Highload++ 2014
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
неприятная правда про язык go
Cоциальный граф "Одноклассников" в myTarget
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
Тестируем производительность распределённых систем, Александр Киров (Parallels)
Why we did not choose Hadoop
NoSQL — неспроста ли это "ЖЖЖ"?
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Ad

Viewers also liked (19)

PPTX
опыт построения и эксплуатации большого файлового хранилища
PPTX
Mysql vs postgresql
PPTX
Go и fuse
PPTX
ночью через лес Stress-test пяти almost-the-same-functionality shared-nothin...
PDF
BeeGo для веб приложений, API и демонов
PDF
Go meetup smotri+ 23.04.2015
PDF
My talk at Linux Piter 2016
PDF
Петр Леменков: Golang и Fedora
PDF
My talk at CEE-SECR 2016
PDF
Harry Potter and the Daemons of Berkeley
PDF
My talk at LVEE 2016
PDF
Go в автобусе
PDF
Codefest 2016 - Go в Openprovider
PDF
Обзорная экскурсия по runit
PDF
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
PDF
PDF
Как ВКонтакте использует Go
PDF
Dynamic Ruby. Lesson #1: Object model
PDF
Ruby строки
опыт построения и эксплуатации большого файлового хранилища
Mysql vs postgresql
Go и fuse
ночью через лес Stress-test пяти almost-the-same-functionality shared-nothin...
BeeGo для веб приложений, API и демонов
Go meetup smotri+ 23.04.2015
My talk at Linux Piter 2016
Петр Леменков: Golang и Fedora
My talk at CEE-SECR 2016
Harry Potter and the Daemons of Berkeley
My talk at LVEE 2016
Go в автобусе
Codefest 2016 - Go в Openprovider
Обзорная экскурсия по runit
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
Как ВКонтакте использует Go
Dynamic Ruby. Lesson #1: Object model
Ruby строки
Ad

Similar to RTB DSP на языке Go: укрощение buzzwords (20)

PPTX
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
PPTX
Мастер-класс про организацию службы эксплуатации
PPTX
Highload++2013: TopGun - архитектура терабитной платформы DPI
PDF
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
PDF
"Девопс - это не только для программистов. Практические примеры из жизни одно...
PPT
Юрий Цыганенко, QA как услуга
PPTX
Как мы делаем Banki.ru
PPTX
Daemons In Web on #devrus
PDF
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
PDF
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
PDF
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
PPTX
Опыт эксплуатации большого проекта на Ruby
PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
PPTX
Wargaming.net: Архитектура современных 3D движков
PPTX
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
PPTX
Всему своё время Highload Junior 2016
PPTX
О фреймворках Backend conf 2016
PDF
О фреймворках / Роман Ивлиев (Банки.ру)
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
PPTX
GDGNSK Работа с геоданными в Go
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
Мастер-класс про организацию службы эксплуатации
Highload++2013: TopGun - архитектура терабитной платформы DPI
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
"Девопс - это не только для программистов. Практические примеры из жизни одно...
Юрий Цыганенко, QA как услуга
Как мы делаем Banki.ru
Daemons In Web on #devrus
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
Опыт эксплуатации большого проекта на Ruby
Обзор перспективных баз данных для highload / Юрий Насретдинов
Wargaming.net: Архитектура современных 3D движков
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
Всему своё время Highload Junior 2016
О фреймворках Backend conf 2016
О фреймворках / Роман Ивлиев (Банки.ру)
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
GDGNSK Работа с геоданными в Go

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

  • 1. Создание
 RTB DSP
 на языке Go Даниил Подольский Qmobi.com
  • 2. Немного о Qmobi.com • Компания Qmobi занимается • интернет-рекламой • продвижением мобильных приложений • без RTB DSP просто не может • Стек технологий (.Net), до настоящего времени использовавшийся в компании, не подходит под задачу • и это прекрасно - мы свободны в выборе!
  • 3. Немного о выборе •на самом деле - выбор совсем не широк •.Net •JVM-экосистема •все_остальное •нет, это нельзя писать на perl •да, мы проверяли •из всего_остального мы выбрали Go •да, это произвол
  • 4. Немного о докладе •никаких цифр и графиков •розовые единороги и радуга повсюду •основная мысль - выбор стал шире: •Net •JVM-экосистема •Go •все_остальное
  • 5. С чего все начиналось
  • 7. Как все начало заканчиваться • 4 часа сборки • C++ • Описание интерфейсов в терминах наследования • Запутанная архитектура • JSON-конфиги, xml-конфиги • Zookeeper • ZeroMQ • Redis
  • 8. RTBkit все •мы написали •smaato-коннектор, Bid и Win •bidder agent •ad-server •logger •интеграцию с trading desc (sort of)
  • 9. RTBkit все •что осталось •router - неудобный при том •banker
  • 10. RTBkit все •что осталось •router - неудобный при том •banker •так, может быть, переписать и их?
  • 11. Немного о задаче •1000 пользователей •по 100 кампаний •по 100 креативов на кампанию •итого - 10 000 000 строк
  • 12. Немного о задаче •1000 пользователей •по 100 кампаний •по 100 креативов на кампанию •итого - 10 000 000 строк •10krps •можно и больше, но не нужно •мы ограничены бюджетом
  • 13. Еще о задаче • Задача выглядит прямой как палка
 и простой как 3 копейки • вот креативы • вот запросы • матч один к другому, и все получится • задача выглядит хорошо масштабирующейся • база креативов обновляется редко • базе креативов не нужна strong consistency
  • 14. А теперь - о проблемах • banker - не масштабируется • чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД
  • 15. А теперь - о проблемах • banker - не масштабируется • чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД • bidder - это расчет пересечения множеств • а пересечения множеств - это или сортировка, или полный перебор
  • 16. А теперь - о проблемах • banker - не масштабируется • чтобы масштабировать banker нам нужна CA (в терминах CAP-теоремы) СУБД • bidder - это расчет пересечения множеств • а пересечения множеств - это или сортировка, или полный перебор • а еще bidder - это сортировка выборки • по приоритету • по времени последнего показа • по цене показа • по остатку на счете кампании
  • 17. И о решениях •нетипичный проект, задачи •или тривиальны •или не имеют решения
  • 18. Об очевидных
 технических решениях • тривиальный код сетевого взаимодействия
 на Go • из нестандартного -
 OpenRTB протокол
 СУБД драйвер
  • 19. Об очевидных
 технических решениях • тривиальный код сетевого взаимодействия
 на Go • из нестандартного OpenRTB протокол
 и СУБД драйвер • nginx - знамя русского хайлоада - на входе • просто для обработки таймаута
  • 20. Об очевидных
 технических решениях • тривиальный код сетевого взаимодействия
 на Go • из нестандартного OpenRTB протокол
 и СУБД драйвер • nginx - знамя русского хайлоада - на входе • просто для обработки таймаута • кеширование креативов и кампаний в памяти • раз уж они влезают
  • 21. Об очевидных
 технических решениях • Geo-таргетинг делается по кодам ISO-3166 • коды получаются из координат с помощью PostGIS • Полная база работает недопустимо медленно, пришлось создать свою выборку, только с границами интересующих нас областей • примерно треть запросов не содержит координат • практически ни один запрос не содержит кодов ISO-3166 - а по стандарту должен!
  • 22. О спорных
 технических решениях • MySQL как banker • прижился со стадии прототипа • да, на триггерах • 10krps - это примерно 20k updates per second • backup есть, failover и balancing нет • и backup может существенно отставать
  • 23. О спорных
 технических решениях • Logger на InfluxDB • InfluxDB - странная база, но она работает • Она - time series • В нее же пишем метрики для Grafana
  • 24. О спорных
 технических решениях • Logger на InfluxDB • InfluxDB - странная база, но она работает • Она - time series • В нее же пишем метрики для Grafana • Обычно для логов используется Elastic Search • Но он слишком сильно грузит диски • И даже известно, почему
  • 25. О самому-страшно
 технических решениях • Как устроена выборка по таргетингу • НИКАК! • мы берем случайную запись, и проверяем ее на соответствие • если не подошла - берем еще одну случайную • и так, пока не выйдет время (100ms)
  • 26. О самому-страшно
 технических решениях • Как устроена выборка по таргетингу • НИКАК! • мы берем случайную запись, и проверяем ее на соответствие • если не подошла - берем еще одну случайную • и так, пока не выйдет время (100ms) • И это работает • и мы можем это доказать
  • 27. О самому-страшно
 технических решениях • На самом деле - это не совсем правда • самый нужный таргетинг захардкожен в структуру кеша • случайная выборка происходит не по всему пространству, а по подмножеству, ограниченному
 Device + OS + version + Geo
  • 28. О самому-страшно
 технических решениях • Подлый удар от Go sheduler • переключение go-routines происходит по IO • это значит - пока мы ползаем по базе, мы не даем другим рутинам работать • пришлось вставить
 runtime.Gosched() в цикл
  • 29. О самому-страшно
 технических решениях • Приоритетов кампаний ровно два • и приоритетные просто
 "дважды изображены на бутылке"
  • 30. О самому-страшно
 технических решениях • Приоритетов кампаний ровно два • и приоритетные просто
 "дважды изображены на бутылке" • прекратите смех!!1
  • 31. Что дальше • заменить MySQL на CA кластер. • Возможно, придется написать свой • таргетинг по произвольному набору параметров - второй подход к снаряду • анализатор логов - выяснить, что нужно бизнесу от него, и написать соответствующий интерфейс • автоматическая обратная связь - именно для нее все и затевается
  • 32. Итоги • довольно быстрый результат • 3 человеко-месяца
  • 33. Итоги • довольно быстрый результат • 3 человеко-месяца • высокоэффективный код • 1 сервер тянет 10krps • уперлись мы в MySQL • MySQL уперся в CPU
  • 34. Итоги • довольно быстрый результат • 3 человеко-месяца • высокоэффективный код • 1 сервер тянет 10krps • уперлись мы в MySQL • MySQL уперся в CPU • полностью свой проект • не считая MySQL и nginx