Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Анатомия баннерной системы Lamoda

Анатомия баннерной системы Lamoda

Лев Тонких (Lamoda) @ MoscowPython Meetup 46

"В докладе рассмотрим баннерную систему, разработанную в Lamoda.

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

Видео: http://www.moscowpython.ru/meetup/46/anatomija-bannernoj-sistemy-lamoda/

Moscow Python Meetup
PRO

June 21, 2017
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Анатомия баннерной
    системы
    Лев Тонких
    Я тут работаю
    !

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. Быково

    View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. 60+
    сервисов

    View Slide

  10. View Slide

  11. LAMODA TECHNOLOGY
    RADAR - 2017.06

    View Slide

  12. Баннерная система

    View Slide

  13. Родовые травмы
    • Началось с Werkzeug, Flask..
    • Кончилось велосипедами
    • Тяжело поддерживать
    • 150 ms, 60% timeouts
    • deploy скриптами

    View Slide

  14. Неприемлемо!

    View Slide

  15. Цели
    Пережить Black Friday
    Надежность, отказоустойчивость
    response time, % timeouts

    View Slide

  16. 21m
    banners view
    per day
    40m
    requests
    300k
    clicks

    View Slide

  17. 10 ms

    View Slide

  18. – Dmitriy Zhiltsov, System Architect
    “Баннерка должна отвечать за 3 ms!”
    Lamoda Tech
    Профилирование приложений Python в реальном времени

    View Slide

  19. View Slide

  20. Баннерная система
    баннерный сервер
    система управления
    баннерными кампаниями
    система статистики

    View Slide

  21. правила таргетинга
    CRUD
    UI
    Публикация
    статика
    СУБК
    Storage
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    Баннерный
    сервер
    Статистика
    Запрос
    Упрощенная схема

    View Slide

  22. Узкие места

    View Slide

  23. Публикация
    правила таргетинга
    Публикация
    статика
    Storage
    • Все и сразу
    • Без очередей

    View Slide

  24. Генерация правил
    таргетинга + обновление
    правила таргетинга
    СУБК
    Storage
    Баннерный
    сервер
    • 2 - 3 минуты
    • не всегда удачно

    View Slide

  25. Явная проблема
    Публикация
    Storage
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    Баннерный
    сервер

    View Slide

  26. Синхронный баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    баннерный
    сервер
    Баннерный
    сервер
    Запрос
    150 ms
    60% timeouts

    View Slide

  27. Баннерная система
    баннерный сервер
    система управления
    баннерными кампаниями
    система статистики

    View Slide

  28. View Slide

  29. creative = images + html
    mobile web

    View Slide

  30. Система управления
    баннерными кампаниями
    • Создание кампаний
    • Создание баннеров
    • Создание таргетинга
    • Выбор площадок (слотов)
    • Просмотр отчетов
    • Публикация в бс
    UI

    View Slide

  31. 30 000 активных
    баннеров

    View Slide

  32. Внимание! Единственный
    компонент системы на
    Django!
    +alembic

    НО!
    • быстро наваять
    • admin interface

    View Slide

  33. Storage

    View Slide

  34. Хранилище
    • html баннеров
    • img
    • правила
    таргетинга
    • etc. баннер

    View Slide

  35. • Креативы надо где-то хранить
    • База для этого не сильно подходит (аварийная
    ситуация)
    • Nginx лучше подходит для кэширования и
    раздачи статики
    • Docker..

    View Slide

  36. Где размещать
    • Трафик
    • Обновление
    • Дисковое
    пространство
    FS баннерного сервера Webdav, s3, …
    • Меньше данных на
    каждом из серверов
    • Одно монолитное
    хранилище
    • Легко масштабировать

    View Slide

  37. • БС занимается показом баннеров — находит
    оптимальный баннер под заданные условия
    • targeting.json — правила таргетинга
    • 1 per time
    Публикация на
    webdav

    View Slide

  38. Баннерная система
    баннерный сервер
    система управления
    баннерными кампаниями
    система статистики

    View Slide

  39. Баннерный сервер
    • простота (2 + 2)
    • слабая связаность
    • масштабируемость
    • отказоустойчивость
    Mission critical
    component
    old version (Werkzeug) — 150 ms. new — 10 ms

    View Slide

  40. Синхронизация
    pull or push?

    View Slide

  41. Pull
    • Сразу видно, если что-
    то пошло не так
    • удобно обновлять все
    сервера
    • cron
    • по-событию
    • доступ к webdav
    Push
    • если есть лимиты -
    оповещать, чтобы не было
    перекруток
    • регистрация всех серверов
    = +1 точка отказа
    • health checks
    • 1
    • 2

    View Slide

  42. targeting >= 10^n MB
    Как передать баннерному серверу?

    View Slide

  43. targeting.json — M MB
    Инстансов баннерного сервера — G шт
    Публикация новых правил в день — O раз
    Передадим
    MB данных
    Если
    То

    View Slide

  44. O * M * G * N
    N — кол-во датацетров
    +

    View Slide

  45. Full
    • Обновление всего
    содержимого
    • Большой объем
    данных
    Diff
    • Δ с последнего
    обновления
    • сложно
    реализовать
    • малый объем
    передачи данных

    View Slide

  46. поменялось название баннера
    Что присылать?

    View Slide

  47. ad_1 -> moscow_python_ad
    *пример

    View Slide

  48. Объект или часть объекта
    Вот, в чем вопрос

    View Slide

  49. Как сделали мы
    • Большая вложенная структура
    • Отправляем изменившиеся сущности
    Изменилось название баннера —
    отправляем весь объект баннера
    + easy debug

    View Slide

  50. Таргетинг

    View Slide

  51. Как работает
    req front req`
    http headers:
    gender
    age
    country
    …18+
    bs
    html(banners), redirects
    resp
    webdav
    creatives
    targeting rules

    * very lite version
    stats
    готовая информация
    10 ms
    no cache

    View Slide

  52. Что происходит в BS
    • pull правил
    • f = lambda x: eval(exprs) -> True | False
    • {‘key’: [f1, f2, f3, …]}
    • x — request obj
    • O(n)
    релевантный баннер

    View Slide

  53. И запустили…

    View Slide

  54. View Slide

  55. View Slide

  56. 21m
    banners view
    per day
    40m
    requests
    300k
    clicks
    150 ms, 60% timeouts 10 ms, 0.04% timeouts

    View Slide

  57. [email protected]
    https://github.com/stleon
    Спасибо! Вопросы?
    tech.lamoda.ru

    View Slide

  58. Как работает
    req front req`
    http headers:
    gender
    age
    country
    …18+
    bs
    html(banners), redirects
    resp
    webdav
    creatives
    targeting rules

    * very lite version
    stats
    готовая информация
    10 ms
    no cache

    View Slide

  59. Что происходит в BS
    • pull правил
    • f = lambda x: eval(exprs) -> True | False
    • {‘key’: [f1, f2, f3, …]}
    • x — request obj
    • O(n)
    релевантный баннер

    View Slide

  60. Неприемлемо!

    View Slide

  61. 21m
    banners view
    per day
    40m
    requests
    300k
    clicks
    150 ms, 60% timeouts 10 ms, 0.04% timeouts

    View Slide

  62. View Slide

  63. View Slide