plarin - АПИшник mytarget - Как "скачать" весь mytarget и не...
TRANSCRIPT
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
Как «скачать»весь myTargetи не лопнутьИванков МихаилProduct Director & CTO
PlarinAPIШНИ
КmyTarget
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Немного статистикиЕжедневно мы «скачиваем» очень много из myTarget
~650 GbДанных в день
(без учета проекций)
>3000Клиентов myTargetв “realtime”
~19 млн.
Запросов к АПИ ежедневно
(без учета проекций)
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
А вот и RPSRPS – request per second (количество запросов в секунду)
227 RPS* В декабре 2014 года (полтора года назад) это было всего
29 RPS
3 секундыСреднее регулярное обновление одного клиента
* При этом мы не нарушаем ни одного правила по RPS в соответствии с /api/v1/throttling.json
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это былоPython и восстание процессоров
Сначала был Python 2.7
Amazon r3.2xlarge8 vCPU, 61 Gb Memory
50-70 Load Average** Число блокирующих процессов в очереди на исполнение в определенный временной интервал. Блокирующий процесс — это процесс, который ожидает ресурсов для продолжения работы.
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это былоПотоки рождают новые потоки
Немножко Python
for tm_client in user._tm_clients: if tm_client.is_blocked or not tm_client.is_active:
continue if tm_client._id not in self.threads:
if tm_client.is_agency: target_method = self.agency_cycle
else: target_method = self.client_cycle
thread = threading.Thread(target=target_method, args=[tm_client._id]) thread.name = tm_client.username thread.daemon = True thread.start()
self.threads[tm_client._id] = thread
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это былоС увеличением клиентов это превращалось в бардак
Теория и практика мультипоточного программирования
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это сталоРазум прояснился, наступил мир
Java, Vert.X, ReactiveX, AsyncHttpMongoDB 3.x, WiredTiger*
*Кстати, в этом году мы перешли на MongoDB Professional с коммерческой поддержкой и улучшили в целом инфраструктуру баз данных, бэкапы, репликацию и шардинг
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это сталоВсего один сервер!
Результаты Java
Amazon c3.xlarge4 vCPU, 7,5 Gb Memory
0.75 Load AverageЭто всего один сервер из 20, который обрабатывает 3000 клиентов myTarget
с запасом прочности в 300-500%
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это сталоГрафики всегда полезны
Мы очень волновались перед запуском нового апдейтера и попросили коллег из myTarget последить за результатами
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Как это сталоКстати, в детстве у Тома Круза были кривые зубы
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Что еще можно улучшить?Ну, кроме того, что бы переписать все «с нуля»
Использовать новые фильтры myTarget для Banners
В начале декабря появились новые фильтры, позволяющие более точно выбирать баннеры, которые необходимо обновить.
GET /api/v1/banners/{banner_id}.json
1. Получение баннеров, в которых изменились свойства:updated__gte=YYYY-MM-DD HH:MM:SS
2. Получение баннеров, в которых изменилась статистика:last_stats_updated__gte=YY-MM-DD HH:MM:SSс фильтром fields=id
С полученными ID в GET /api/v1/statistics/{object_type}/{object_id}/{stat_type}/{date_from}-{date_to}.json
Подробнее: https://target.my.com/doc/api/detailed/#resource_banners
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Что еще можно улучшить?Ну, кроме того, что бы использовать Java
Использовать триггеры в Campaigns
GET /api/v1/campaigns/{campaign_id}.json
Поле last_stats_updated сигнализирует о том, нужно ли опрашивать новую статистику или нет.
P.S. Учтите, это поле полезно при отставшем «чаржинге» myTarget
Подробнее: https://target.my.com/doc/api/detailed/#object_campaignstat
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Что еще можно улучшить?Для некоторых методов можно настроить Nginx
Если вы делаете очень много запросов и не хотите их контролировать самостоятельно, можно настроить Nginx как прокси с ограничениями, а так же это даст хорошие возможности для логирования
http { limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;... server {...
location /statistics { proxy_pass https://target.my.com/$request_uri;
limit_req zone=one burst=200;}
}}
Подробнее: http://nginx.org/ru/docs/http/ngx_http_limit_req_module.html
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Какие результаты?Быстрее, выше, сильнее
Все это привело к тому, что 1 клиент myTarget обновляется в среднем 3 секунды с минимальным количеством запросов (ранее было 40 секунд)
Полная загрузка данных (full update) по агентскому кабинету с 100 клиентами, в каждом по 100 кампаний (включая всю доступную статистику за все время, внешний вид баннеров, настройки РК и т.д.) – от 3 до 5 минут.
Один сервер с 4 vCPU и 8 GB MEM!
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Немного полезногоСравнительная таблица запросов к /api/v1/statistics/banners/
Запросы полной статистики к /api/v1/statistics/banners/Количество баннеров(в 1 запросе)
Почасовая статистика(скорость ответа в секундах)
Дневная статистика(скорость ответа в секундах)
Вся 30 дней
14 дне
й
5 дней
1 ден
ь
Вся 30 дней
14 дней
5 дней
1 день
3000 - - - - - - - - 20 181500 - - - - - 16 - 16 11 10750 - - - - 12 9 13 8 6 4500 - - - - 8 7 8 5 4 4100 14 14 9 3 2 1 2 1 1 1
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Немного полезногоСравнительная таблица запросов к /api/v1/statistics/campaigns/
Запросы полной статистики к /api/v1/statistics/campaigns/Количество кампаний(в 1 запросе)
Почасовая статистика(скорость ответа в секундах)
Дневная статистика(скорость ответа в секундах)
Вся 30 дней
14 дне
й
5 дней
1 ден
ь
Вся 30 дней
14 дней
5 дней
1 день
150 - - - 10 4 3 2 2 1 175 19 20 13 5 2 1 1 1 1 150 14 14 9 4 2 1 1 1 1 125 7 7 5 2 1 1 1 1 1 1
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Что бы хотелось по улучшениям в APIЛучшее не всегда враг хорошего
1. Добавить в кампании такие же фильтры, как и в баннерыСократит объем данных и нагрузку
2. Push статистики сразу же, после ее измененияИдеальный случай, количество запросов упадет к нулю
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Работаем с проекциямиТеперь это отдельный сервис внутри Plarin
~84 GBДанных в день
>15 000Кампаний, которым
требуются актуальные цены
~1 150 000
Запросов к АПИ ежедневно(примерно 13
кампаний в секунду)При этом около 90% запросов проекций только для получения оптимальной цены.
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Работаем с проекциямиСервис отселили отдельно
Раньше это было частью основного апдейтера, но часто обновления блокировали таймауты по 15 минут, ошибки 500 и т.д.
Мы этот сервис вынесли в отдельный.
Java, AsyncHttpMongoDB 3.x, WiredTiger
Amazon c3.xlarge4 vCPU, 7,5 Gb Memory
0.105 Load Average
Запас прочности – 1000-2000%
15 000 кампаний по 13 в секунду это 20 минут на полный цикл.
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Работаем с проекциямиИ тут математика
Исходные 84 Gb в день на самом деле оказывается больше, так как ответы приходят запакованными в gzip, в среднем по 40кб.
Каждый ответ распаковывается примерно в 400кб и содержит в себе > 2000 точек.
Итого: 6 Gb хранения на 15 000 кампаний.
Что мы делаем:1) Урезаем количество точек, оставляя из повторяющихся охватов только один
с минимальной ценой2) Отдельно вычисляем и храним минимальную и максимальную цены, а так же
оптимальную цену для каждой рекламной кампании
В итоге в каждой проекции остается 12 кб, и 51 точка вместо 2 000+
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Что бы хотелось по улучшениям в APIЛучшее не всегда враг хорошего
1. Ограничить количество точек в ответе, оставив по 1 точке на каждый % охвата
2. Возвращать верные лимиты для запрашиваемого пакета, не менее минимальной цены и не более максимальной цены
3. Сделать доступным в запросах передачу только ID существующей кампании, без указания всего таргетинга
4. Расширить метод, когда для нескольких кампаний можно получить только оптимальную цену одним запросом, а лучше вынести оптимальную цену в объект Campaign (90% запросов к проекциям только для получения оптимальной цены)
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Проблемные местаЛучшее не всегда враг хорошего
User.jsonЧасто забираем, другой возможности нет определить остатки бюджетов на аккаунте и статус клиента (активный, заблокированный)
КонверсииСейчас не забираем, и по прежнему не можем определить у какой кампании есть конверсии, а у какой нет. При добавления запроса на все кампании в день прибавится 3-5 млн запросов.
В самом ответе конверсий не хватает ID целей т.к. они могут поменяться, не к чему привязаться.
РемаркетингЧасто забираем, т.к. не можем определить когда любой из списков изменился, а когда нет (6 списков, 16 запросов в секунду, более 8 млн запросов в день) - 42% от всех запросов.
Мы делаем это в цикле группой по 10 клиентов и обновление всех клиентов за один цикл – 10 минут.
99.9% ответов ремаркетинг списков без изменений по сравнению с предыдущим.
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
РешениеЛучшее не всегда враг хорошего
Новый метод - updated_objects, который решит все проблемы
Может содержать в себе информацию о времени последнего изменения:
1. Свойств кампаний или статистики кампаний2. Свойств баннеров или статистики баннеров3. Списков ремаркетинг групп4. Наличие конверсий в РК
Это позволит фактически дергать только один метод и существенно сократить запросы к другим методам, совершая их только тогда, когда это действительно актуально.
P.S. Ну или, хотя бы, новый метод для ремаркетинг групп и вынос количества конверсий в Campaigns.
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
APIШНИК
Немного статистики в сравнении с прошлымРост показателей
2014 д ека брь 2016 ма рт
4,400
11,000 4,000
15,000
Активные кампанииОстановленные Запущенные
2015 и юль 2016 ма рт
25,000
90,000
POSTBACK КонверсииВсего конверсий в день
Plarin – единая система управления рекламой ВКонтакте и myTarget
Михаил Иванков, 2016
Спасибо за вниманиеИванков МихаилProduct Director & CTO, Plarin
PlarinЕдиная система управления таргетированной рекламойВКонтакте и myTarget
Все презентации Plarin в Facebookhttps://www.facebook.com/plarin.net