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

Post on 09-May-2015

313 Views

Category:

Internet

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

www.blahblah.com

Иван

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

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

аффилят Иван

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

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 можно мгновенно убрать с нее нагрузку.

top related