25
Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016 Как «скачать» весь myTarget и не лопнуть Иванков Михаил Product Director & CTO Plarin API ШНИК myTarget РЕКОМЕНДОВАННЫЙ РАЗРАБОТЧИК 2013—2016

Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

  • Upload
    -

  • View
    322

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

Как «скачать»весь myTargetи не лопнуть

Иванков МихаилProduct Director & CTO

PlarinAPIШНИК

myTarget

РЕКОМЕНДОВАННЫЙРАЗРАБОТЧИК

2013—2016

Page 2: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКНемного статистикиЕжедневно мы «скачиваем» очень много из myTarget

~650 GbДанных в день(без учета проекций)

>3000Клиентов myTargetв “realtime”

~19 млн.Запросов к АПИ

ежедневно(без учета проекций)

Page 3: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКА вот и RPSRPS – request per second (количество запросов в секунду)

227 RPS*В декабре 2014 года (полтора года назад) это было всего 29 RPS

3 секундыСреднее регулярное обновление одного клиента

* При этом мы не нарушаем ни одного правила по RPS в соответствии с /api/v1/throttling.json

Page 4: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это былоPython и восстание процессоров

Сначала был Python 2.7

Amazon r3.2xlarge8 vCPU, 61 Gb Memory

50-70 Load Average*

* Число блокирующих процессов в очереди на исполнение в определенный временной интервал. Блокирующий процесс — это процесс, который ожидает ресурсов для продолжения работы.

Page 5: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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.usernamethread.daemon = Truethread.start() self.threads[tm_client._id] = thread

Page 6: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это былоС увеличением клиентов это превращалось в бардак

Теория и практика мультипоточного программирования

Page 7: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это сталоРазум прояснился, наступил мир

Java, Vert.X, ReactiveX, AsyncHttpMongoDB 3.x, WiredTiger*

*Кстати, в этом году мы перешли на MongoDB Professional с коммерческой поддержкой и улучшили в целом инфраструктуру баз данных, бэкапы, репликацию и шардинг

Page 8: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это сталоВсего один сервер!

Результаты Java

Amazon c3.xlarge4 vCPU, 7,5 Gb Memory

0.75 Load Average

Это всего один сервер из 20, который обрабатывает 3000 клиентов myTarget

с запасом прочности в 300-500%

Page 9: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это сталоГрафики всегда полезны

Мы очень волновались перед запуском нового апдейтера и попросили коллег из myTargetпоследить за результатами

Page 10: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККак это сталоКстати, в детстве у Тома Круза были кривые зубы

Page 11: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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

Page 12: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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

Page 13: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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

Page 14: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИККакие результаты?Быстрее, выше, сильнее

Все это привело к тому, что 1 клиент myTarget обновляется в среднем 3 секунды с минимальным количеством запросов (ранее было 40 секунд)

Полная загрузка данных (full update) по агентскому кабинету с 100 клиентами, в каждом по 100 кампаний (включая всю доступную статистику за все время, внешний вид баннеров, настройки РК и т.д.) – от 3 до 5 минут.

Один сервер с 4 vCPU и 8 GB MEM!

Page 15: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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

Page 16: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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

Page 17: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКЧто бы хотелось по улучшениям в APIЛучшее не всегда враг хорошего

1. Добавить в кампании такие же фильтры, как и в баннерыСократит объем данных и нагрузку

2. Push статистики сразу же, после ее измененияИдеальный случай, количество запросов упадет к нулю

Page 18: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКРаботаем с проекциямиТеперь это отдельный сервис внутри Plarin

~84 GBДанных в день

>15 000Кампаний, которым

требуются актуальные цены

~1 150 000Запросов к АПИ

ежедневно(примерно 13 кампаний

в секунду)

При этом около 90% запросов проекций только для получения оптимальной цены.

Page 19: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

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 минут на полный цикл.

Page 20: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКРаботаем с проекциямиИ тут математика

Исходные 84 Gb в день на самом деле оказывается больше, так как ответы приходят запакованными в gzip, в среднем по 40кб.

Каждый ответ распаковывается примерно в 400кб и содержит в себе > 2000 точек.

Итого: 6 Gb хранения на 15 000 кампаний.

Что мы делаем:1) Урезаем количество точек, оставляя из повторяющихся охватов только один с

минимальной ценой2) Отдельно вычисляем и храним минимальную и максимальную цены, а так же

оптимальную цену для каждой рекламной кампании

В итоге в каждой проекции остается 12 кб, и 51 точка вместо 2 000+

Page 21: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКЧто бы хотелось по улучшениям в APIЛучшее не всегда враг хорошего

1. Ограничить количество точек в ответе, оставив по 1 точке на каждый % охвата

2. Возвращать верные лимиты для запрашиваемого пакета, не менее минимальной цены и не более максимальной цены

3. Сделать доступным в запросах передачу только ID существующей кампании, без указания всего таргетинга

4. Расширить метод, когда для нескольких кампаний можно получить только оптимальную цену одним запросом, а лучше вынести оптимальную цену в объект Campaign (90% запросов к проекциям только для получения оптимальной цены)

Page 22: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКПроблемные местаЛучшее не всегда враг хорошего

User.jsonЧасто забираем, другой возможности нет определить остатки бюджетов на аккаунте и статус клиента (активный, заблокированный)

КонверсииСейчас не забираем, и по прежнему не можем определить у какой кампании есть конверсии, а у какой нет. При добавления запроса на все кампании в день прибавится 3-5 млн запросов.

В самом ответе конверсий не хватает ID целей т.к. они могут поменяться, не к чему привязаться.

РемаркетингЧасто забираем, т.к. не можем определить когда любой из списков изменился, а когда нет (6 списков, 16 запросов в секунду, более 8 млн запросов в день) - 42% от всех запросов.

Мы делаем это в цикле группой по 10 клиентов и обновление всех клиентов за один цикл – 10 минут.

99.9% ответов ремаркетинг списков без изменений по сравнению с предыдущим.

Page 23: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКРешениеЛучшее не всегда враг хорошего

Новый метод - updated_objects, который решит все проблемы

Может содержать в себе информацию о времени последнего изменения:

1. Свойств кампаний или статистики кампаний2. Свойств баннеров или статистики баннеров3. Списков ремаркетинг групп4. Наличие конверсий в РК

Это позволит фактически дергать только один метод и существенно сократить запросы к другим методам, совершая их только тогда, когда это действительно актуально.

p.s. Ну или, хотя бы, новый метод для ремаркетинг групп и вынос количества конверсий в Campaigns.

Page 24: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

APIШНИКНемного статистики в сравнении с прошлымРост показателей

4 400

11 0004 000

15 000

2014 ДЕКАБРЬ 2016 МАРТ

АКТИВНЫЕ КАМПАНИИОстановленные Запущенные

25 000

90 000

2015 ИЮЛЬ 2016 МАРТ

POSTBACK КОНВЕРСИИВсегоконверсийвдень

Page 25: Как «скачать» весь myTarget и не лопнуть. Михаил Иванков (Plarin)

Plarin – единая система управления рекламой ВКонтакте и myTarget Михаил Иванков, 2016

Спасибо за вниманиеИванков МихаилProduct Director & CTO, Plarin

PlarinЕдиная система управления таргетированной рекламойВКонтакте и myTarget

Все презентации Plarin в Facebookhttps://www.facebook.com/plarin.net

РЕКОМЕНДОВАННЫЙРАЗРАБОТЧИК

2013—2016