Архитектура партнерской программы aviasales
TRANSCRIPT
Архитектура партнерской программы
aviasales.ruАлексей Шайхалеев
https://www.facebook.com/nimdraugsael @nimdraugsael
Партнерская программа
www.blahblah.comАвиабилетыОтели
СтраховкиЭкскурсии
Такси
аффилят Иван
Как выглядит процесс покупки услуги?
• Олег заходит на сайт www.blahblah.com и видит баннер
• Олег кликает по баннеру и попадает на страницу партнера (лендинг)
• Олег заполняет форму и нажимает кнопку Купить • Олег оплачивает услугу. PROFIT!
Пользователь Олег
Типы событий
• загрузка • клик по баннеру • переход на страницу партнера • активность на лендинге • покупка
Решение для отслеживания событийНемножко магии!
На самом деле, это просто способ гарантированно отправить запрос к серверу из браузера пользователя
При помощи модуля для nginx мы добавляем каждому пользователю уникальный идентификатор. Для каждого уникального пользователя мы сохраняем всю цепочку
взаимодействия:
Загрузка баннера
Клик по баннеру
Переход на страницу партнера
Активность на странице Покупка
Требования к серверной части
• Изолированность от основного rails приложения
!
• Отказоустойчивость
!
• Масштабируемость
!
• Простота!
Что же нам нужно?
Веб сервер База данных
Клиенты
Больше веб-серверов!
База данных
Пчелки! bee
NGINX
Добавим очередь для записи в базу
База данных
Муравьи! ant
NGINX Очередь2 redis’а
Будем следить за самочувствием всех процессов
База данных
NGINX
Monit
Очередь2 redis’а
А еще можно сделать кластер
База данных
NGINX
Нода 1
NGINX
Нода 2
HAProxy
Про пчелокПриложение, на основе веб-сервера Tornado.
Атомарная единица кода - unit. Как правило, это одна-единственная функция на python, делающая какую-то одну
операцию. Какие бывают юниты?
• Сохранение в куки GET параметров • Генерация уникального идентификатора для запроса
Про пчелокЮниты формируют цепочки chain. Самый простой аналог цепочки - конвейер. Данные попадают в первый юнит,
результат работы первого юнита попадает на вход второго, результат работы второго - на вход третьего и так далее.
Запрос “Покажи баннер”validation_start_event
uuid
show_content
prepare_start_event
save_event
Про пчелок
Все взаимодействия с системой, в том числе для дебага - через протокол http.
Из-за максимальной простоты и конвейерной обработки - промежуточный результат можно посмотреть на любом
этапе простым curl’ом или заглянув в очередь. Это удобно!
База данныхЧто делать, если данных много, а показывать по ним
отчеты нужно быстро и часто?Индексы mysql не очень хорошо себя чувствуют, когда нужно, например, сгруппировать значения
таблицы на пару миллионов записей, а потом еще и отсортировать результат в интересном порядке.
Поэтому мы агрегируем!То есть каждые несколько минут мы пересчитываем данные за последнее время и складываем результат в специальную таблицу, из которой и формируем
отчеты для наших аффилятов.
Интеграция с основным rails приложением
travelpayouts.com=админка для аффилятов
кластер с нодами партнерской сети
сервер баз данных события и покупки из партнерской сети
Интеграция с основным rails приложением
travelpayouts.com=админка для аффилятов
кластер с нодами партнерской сети
сервер баз данных события и покупки из партнерской сети
Баннеры, url страниц для редиректа, настройки
Данные для аффилятских
отчетов
Масштабируемость
Не успеваем раздавать контент - больше пчелокВырастает очередь, не успеваем класть в базу - больше муравьев
Новая пчела или муравей запускается за несколько секунд. Новая нода разворачивается из чистого сервера за несколько
минут.
ОтказоустойчивостьВыходит из строя один из redis’ов - оперативно
переключаемся на рабочий. !
Ломается база данных - данные будут копиться в очереди, пока не появится возможность писать в базу.
!Выходит из строя нода (например, задеплоили
нерабочий код) - в HAProxy можно мгновенно убрать с нее нагрузку.