Transcript
Page 1: Архитектура партнерской программы aviasales

Архитектура партнерской программы

aviasales.ruАлексей Шайхалеев

https://www.facebook.com/nimdraugsael @nimdraugsael

Page 2: Архитектура партнерской программы aviasales

Партнерская программа

www.blahblah.com

Иван

Page 3: Архитектура партнерской программы aviasales

Партнерская программа

www.blahblah.comАвиабилетыОтели

аффилят Иван

Page 4: Архитектура партнерской программы aviasales

Партнерская программа

www.blahblah.comАвиабилетыОтели

СтраховкиЭкскурсии

Такси

аффилят Иван

Page 5: Архитектура партнерской программы aviasales

Как выглядит процесс покупки услуги?

• Олег заходит на сайт www.blahblah.com и видит баннер

• Олег кликает по баннеру и попадает на страницу партнера (лендинг)

• Олег заполняет форму и нажимает кнопку Купить • Олег оплачивает услугу. PROFIT!

Пользователь Олег

Page 6: Архитектура партнерской программы aviasales

Типы событий

• загрузка • клик по баннеру • переход на страницу партнера • активность на лендинге • покупка

Page 7: Архитектура партнерской программы aviasales

Решение для отслеживания событийНемножко магии!

На самом деле, это просто способ гарантированно отправить запрос к серверу из браузера пользователя

При помощи модуля для nginx мы добавляем каждому пользователю уникальный идентификатор. Для каждого уникального пользователя мы сохраняем всю цепочку

взаимодействия:

Загрузка баннера

Клик по баннеру

Переход на страницу партнера

Активность на странице Покупка

Page 8: Архитектура партнерской программы aviasales

Требования к серверной части

• Изолированность от основного rails приложения

!

• Отказоустойчивость

!

• Масштабируемость

!

• Простота!

Page 9: Архитектура партнерской программы aviasales

Что же нам нужно?

Веб сервер База данных

Клиенты

Page 10: Архитектура партнерской программы aviasales

Больше веб-серверов!

База данных

Пчелки! bee

NGINX

Page 11: Архитектура партнерской программы aviasales

Добавим очередь для записи в базу

База данных

Муравьи! ant

NGINX Очередь2 redis’а

Page 12: Архитектура партнерской программы aviasales

Будем следить за самочувствием всех процессов

База данных

NGINX

Monit

Очередь2 redis’а

Page 13: Архитектура партнерской программы aviasales

А еще можно сделать кластер

База данных

NGINX

Нода 1

NGINX

Нода 2

HAProxy

Page 14: Архитектура партнерской программы aviasales

Про пчелокПриложение, на основе веб-сервера Tornado.

Атомарная единица кода - unit. Как правило, это одна-единственная функция на python, делающая какую-то одну

операцию. Какие бывают юниты?

• Сохранение в куки GET параметров • Генерация уникального идентификатора для запроса

Page 15: Архитектура партнерской программы aviasales

Про пчелокЮниты формируют цепочки chain. Самый простой аналог цепочки - конвейер. Данные попадают в первый юнит,

результат работы первого юнита попадает на вход второго, результат работы второго - на вход третьего и так далее.

Запрос “Покажи баннер”validation_start_event

uuid

show_content

prepare_start_event

save_event

Page 16: Архитектура партнерской программы aviasales

Про пчелок

Все взаимодействия с системой, в том числе для дебага - через протокол http.

Из-за максимальной простоты и конвейерной обработки - промежуточный результат можно посмотреть на любом

этапе простым curl’ом или заглянув в очередь. Это удобно!

Page 17: Архитектура партнерской программы aviasales

База данныхЧто делать, если данных много, а показывать по ним

отчеты нужно быстро и часто?Индексы mysql не очень хорошо себя чувствуют, когда нужно, например, сгруппировать значения

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

Поэтому мы агрегируем!То есть каждые несколько минут мы пересчитываем данные за последнее время и складываем результат в специальную таблицу, из которой и формируем

отчеты для наших аффилятов.

Page 18: Архитектура партнерской программы aviasales

Интеграция с основным rails приложением

travelpayouts.com=админка для аффилятов

кластер с нодами партнерской сети

сервер баз данных события и покупки из партнерской сети

Page 19: Архитектура партнерской программы aviasales

Интеграция с основным rails приложением

travelpayouts.com=админка для аффилятов

кластер с нодами партнерской сети

сервер баз данных события и покупки из партнерской сети

Баннеры, url страниц для редиректа, настройки

Данные для аффилятских

отчетов

Page 20: Архитектура партнерской программы aviasales

Масштабируемость

Не успеваем раздавать контент - больше пчелокВырастает очередь, не успеваем класть в базу - больше муравьев

Новая пчела или муравей запускается за несколько секунд. Новая нода разворачивается из чистого сервера за несколько

минут.

Page 21: Архитектура партнерской программы aviasales

ОтказоустойчивостьВыходит из строя один из redis’ов - оперативно

переключаемся на рабочий. !

Ломается база данных - данные будут копиться в очереди, пока не появится возможность писать в базу.

!Выходит из строя нода (например, задеплоили

нерабочий код) - в HAProxy можно мгновенно убрать с нее нагрузку.


Top Related