SlideShare a Scribd company logo
1 of 35
Download to read offline
Создание

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

What's hot

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

What's hot (19)

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

Viewers also liked

опыт построения и эксплуатации большого файлового хранилища
опыт построения и эксплуатации большого файлового хранилищаопыт построения и эксплуатации большого файлового хранилища
опыт построения и эксплуатации большого файлового хранилищаDaniel Podolsky
 
ночью через лес Stress-test пяти almost-the-same-functionality shared-nothin...
ночью через лес  Stress-test пяти almost-the-same-functionality shared-nothin...ночью через лес  Stress-test пяти almost-the-same-functionality shared-nothin...
ночью через лес Stress-test пяти almost-the-same-functionality shared-nothin...Daniel Podolsky
 
BeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновBeeGo для веб приложений, API и демонов
BeeGo для веб приложений, API и демоновAnton Piskunov
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
My talk at Linux Piter 2016
My talk at Linux Piter 2016My talk at Linux Piter 2016
My talk at Linux Piter 2016Alex Chistyakov
 
Петр Леменков: Golang и Fedora
Петр Леменков: Golang и FedoraПетр Леменков: Golang и Fedora
Петр Леменков: Golang и FedoraYandex
 
My talk at CEE-SECR 2016
My talk at CEE-SECR 2016My talk at CEE-SECR 2016
My talk at CEE-SECR 2016Alex Chistyakov
 
Harry Potter and the Daemons of Berkeley
Harry Potter and the Daemons of BerkeleyHarry Potter and the Daemons of Berkeley
Harry Potter and the Daemons of BerkeleyAlex Chistyakov
 
Go в автобусе
Go в автобусеGo в автобусе
Go в автобусеArtem Kovardin
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderIgor Dolzhikov
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runitAlexander Shcherbinin
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесAnton Piskunov
 
Как ВКонтакте использует Go
Как ВКонтакте использует GoКак ВКонтакте использует Go
Как ВКонтакте использует GoArtem Kovardin
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelAlex Mikitenko
 

Viewers also liked (19)

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

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

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest
 
Мастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатацииМастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатацииNikolay Sivko
 
Highload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPIHighload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPILeonid Yuriev
 
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IEКак сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IEАртём Кудзев
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...it-people
 
Юрий Цыганенко, QA как услуга
Юрий Цыганенко, QA как услугаЮрий Цыганенко, QA как услуга
Юрий Цыганенко, QA как услугаSQADays_2009_Piter
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ruRoman Ivliev
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Mad Devs
 
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Колёса Крыша Маркет
 
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...
CodeFest 2012. Липский Н. — JIT vs. AOT. Единство и борьба динамического и ст...CodeFest
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковDevGAMM Conference
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Всему своё время Highload Junior 2016
Всему своё время   Highload Junior  2016Всему своё время   Highload Junior  2016
Всему своё время Highload Junior 2016Roman Ivliev
 
О фреймворках Backend conf 2016
О фреймворках Backend conf 2016О фреймворках Backend conf 2016
О фреймворках Backend conf 2016Roman Ivliev
 
О фреймворках / Роман Ивлиев (Банки.ру)
О фреймворках / Роман Ивлиев (Банки.ру)О фреймворках / Роман Ивлиев (Банки.ру)
О фреймворках / Роман Ивлиев (Банки.ру)Ontico
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 
Работа с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in GoРабота с геоданными в Go GDGNSK / Work with Geodata in Go
Работа с геоданными в Go GDGNSK / Work with Geodata in GoMad Devs
 

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

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