Кейс ArrowMedia: "Результативность от инструмента к инструменту"
Plarin - АПИшник myTarget - Как "скачать" весь myTarget и не лопнуть
1. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
Как «скачать»
весь myTarget
и не лопнуть
Иванков Михаил
Product Director & CTO
Plarin
APIШНИК
myTarget
2. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Немного статистики
Ежедневно мы «скачиваем» очень много из myTarget
~650 Gb
Данных в день
(без учета проекций)
>3000
Клиентов myTarget
в “realtime”
~19 млн.
Запросов к АПИ
ежедневно
(без учета проекций)
3. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
А вот и RPS
RPS – request per second (количество запросов в секунду)
227 RPS*
В декабре 2014 года (полтора года назад) это было всего 29 RPS
3 секунды
Среднее регулярное обновление одного клиента
* При этом мы не нарушаем ни одного правила по RPS в соответствии с /api/v1/throttling.json
4. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это было
Python и восстание процессоров
Сначала был Python 2.7
Amazon r3.2xlarge
8 vCPU, 61 Gb Memory
50-70 Load Average*
* Число блокирующих процессов в очереди на исполнение в определенный временной
интервал. Блокирующий процесс — это процесс, который ожидает ресурсов для
продолжения работы.
5. 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
6. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это было
С увеличением клиентов это превращалось в бардак
Теория и практика мультипоточного программирования
7. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это стало
Разум прояснился, наступил мир
Java, Vert.X, ReactiveX, AsyncHttp
MongoDB 3.x, WiredTiger*
*Кстати, в этом году мы перешли на MongoDB Professional с коммерческой поддержкой и улучшили в целом инфраструктуру баз
данных, бэкапы, репликацию и шардинг
8. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это стало
Всего один сервер!
Результаты Java
Amazon c3.xlarge
4 vCPU, 7,5 Gb Memory
0.75 Load Average
Это всего один сервер из 20, который
обрабатывает 3000 клиентов myTarget
с запасом прочности в 300-500%
9. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это стало
Графики всегда полезны
Мы очень волновались перед запуском нового апдейтера и попросили коллег из myTarget
последить за результатами
10. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Как это стало
Кстати, в детстве у Тома Круза были кривые зубы
11. 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
12. 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
13. 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
14. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Какие результаты?
Быстрее, выше, сильнее
Все это привело к тому, что 1 клиент myTarget обновляется в
среднем 3 секунды с минимальным количеством запросов (ранее
было 40 секунд)
Полная загрузка данных (full update) по агентскому кабинету с 100
клиентами, в каждом по 100 кампаний (включая всю доступную
статистику за все время, внешний вид баннеров, настройки РК и
т.д.) – от 3 до 5 минут.
Один сервер с 4 vCPU и 8 GB MEM!
15. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Немного полезного
Сравнительная таблица запросов к /api/v1/statistics/banners/
Запросы полной статистики к /api/v1/statistics/banners/
Количество баннеров
(в 1 запросе)
Почасовая статистика
(скорость ответа в секундах)
Дневная статистика
(скорость ответа в секундах)
Вся 30
дней
14
дней
5
дней
1
день
Вся 30
дней
14
дней
5
дней
1
день
3000 - - - - - - - - 20 18
1500 - - - - - 16 - 16 11 10
750 - - - - 12 9 13 8 6 4
500 - - - - 8 7 8 5 4 4
100 14 14 9 3 2 1 2 1 1 1
16. 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 1
75 19 20 13 5 2 1 1 1 1 1
50 14 14 9 4 2 1 1 1 1 1
25 7 7 5 2 1 1 1 1 1 1
17. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Что бы хотелось по улучшениям в API
Лучшее не всегда враг хорошего
1. Добавить в кампании такие же фильтры, как и в баннеры
Сократит объем данных и нагрузку
2. Push статистики сразу же, после ее изменения
Идеальный случай, количество запросов упадет к нулю
18. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Работаем с проекциями
Теперь это отдельный сервис внутри Plarin
~84 GB
Данных в день
>15 000
Кампаний, которым
требуются
актуальные цены
~1 150 000
Запросов к АПИ
ежедневно
(примерно 13 кампаний
в секунду)
При этом около 90% запросов проекций только для получения оптимальной цены.
19. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Работаем с проекциями
Сервис отселили отдельно
Раньше это было частью основного апдейтера, но часто обновления блокировали таймауты по 15 минут,
ошибки 500 и т.д.
Мы этот сервис вынесли в отдельный.
Java, AsyncHttp
MongoDB 3.x, WiredTiger
Amazon c3.xlarge
4 vCPU, 7,5 Gb Memory
0.105 Load Average
Запас прочности – 1000-2000%
15 000 кампаний по 13 в секунду это 20
минут на полный цикл.
20. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Работаем с проекциями
И тут математика
Исходные 84 Gb в день на самом деле оказывается больше, так как ответы приходят
запакованными в gzip, в среднем по 40кб.
Каждый ответ распаковывается примерно в 400кб и содержит в себе > 2000 точек.
Итого: 6 Gb хранения на 15 000 кампаний.
Что мы делаем:
1) Урезаем количество точек, оставляя из повторяющихся охватов только один с
минимальной ценой
2) Отдельно вычисляем и храним минимальную и максимальную цены, а так же
оптимальную цену для каждой рекламной кампании
В итоге в каждой проекции остается 12 кб, и 51 точка вместо 2 000+
21. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Что бы хотелось по улучшениям в API
Лучшее не всегда враг хорошего
1. Ограничить количество точек в ответе, оставив по 1 точке на каждый % охвата
2. Возвращать верные лимиты для запрашиваемого пакета, не менее минимальной цены
и не более максимальной цены
3. Сделать доступным в запросах передачу только ID существующей кампании, без
указания всего таргетинга
4. Расширить метод, когда для нескольких кампаний можно получить только оптимальную
цену одним запросом, а лучше вынести оптимальную цену в объект Campaign (90%
запросов к проекциям только для получения оптимальной цены)
22. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Проблемные места
Лучшее не всегда враг хорошего
User.json
Часто забираем, другой возможности нет определить остатки бюджетов на аккаунте и статус клиента
(активный, заблокированный)
Конверсии
Сейчас не забираем, и по прежнему не можем определить у какой кампании есть конверсии, а у какой
нет. При добавления запроса на все кампании в день прибавится 3-5 млн запросов.
В самом ответе конверсий не хватает ID целей т.к. они могут поменяться, не к чему привязаться.
Ремаркетинг
Часто забираем, т.к. не можем определить когда любой из списков изменился, а когда нет (6 списков,
16 запросов в секунду, более 8 млн запросов в день) - 42% от всех запросов.
Мы делаем это в цикле группой по 10 клиентов и обновление всех клиентов за один цикл – 10 минут.
99.9% ответов ремаркетинг списков без изменений по сравнению с предыдущим.
23. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Решение
Лучшее не всегда враг хорошего
Новый метод - updated_objects, который решит все проблемы
Может содержать в себе информацию о времени последнего изменения:
1. Свойств кампаний или статистики кампаний
2. Свойств баннеров или статистики баннеров
3. Списков ремаркетинг групп
4. Наличие конверсий в РК
Это позволит фактически дергать только один метод и существенно сократить запросы к другим
методам, совершая их только тогда, когда это действительно актуально.
P.S. Ну или, хотя бы, новый метод для ремаркетинг групп и вынос количества конверсий в Campaigns.
24. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
APIШНИК
Немного статистики в сравнении с прошлым
Рост показателей
4,400
11,000
4,000
15,000
2014 ДЕКАБРЬ 2016 МАРТ
АКТИВНЫЕ КАМПАНИИ
Остановленные Запущенные
25,000
90,000
2015 ИЮЛЬ 2016 МАРТ
POSTBACK КОНВЕРСИИ
Всего конверсий в день
25. Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016
Спасибо за внимание
Иванков Михаил
Product Director & CTO, Plarin
Plarin
Единая система управления таргетированной рекламой
ВКонтакте и myTarget
Все презентации Plarin в Facebook
https://www.facebook.com/plarin.net