View
2.814
Download
5
Category
Preview:
DESCRIPTION
В докладе на примере системы метапоиска aviasales будет рассмотрен переход от монолитной архитектуры RoR приложения к многозвенной системе внутренней разработки на базе tornado/python в целях ослабления зависимостей между подсистемами, упрощения контроля за потоком данных и изоляции потенциальных аварийных ситуаций. Будут рассмотрены побочные эффекты этого перехода, такие как устойчивость к пиковым нагрузкам, упрощение схемы выкатки обновлений и сокращение потребляемых машинных ресурсов.
Citation preview
Принцип работы системы метапоиска
Aviasales cегодня
● 800 000 запросов поиска авиабилетов в сутки● 6 000 000 уникальных пользователей в месяц● 35% от всех авиабилетов, проданных в России
через интернет за 2013 год.
Эволюция системы метапоиска
SEO Landingclient request
Эволюция системы метапоиска
SEO Landingclient request RoR Applicationredirect
Эволюция системы метапоиска
Эволюция системы метапоиска
SEO Landingclient request
Search Clientredirect API
Search Engine
Minimal prices
Statisticqueue
queue
Travel Payoutsclient request
API
Эволюция системы метапоиска
SEO Landingclient request
Search Clientredirect API
Search Engine
Minimal prices
Statisticqueue
queue
Travel Payoutsclient request
API
client request Mobile
API
Notifications
queu
e
Архитектура поискового движка
request requestHAProxy
request request
requestrequest
NODE 1NGINX + PASSENGER
Ruby on Rails
NODE 2NGINX + PASSENGER
Ruby on Rails
...
MYSQLMASTER/SLAVE
REPLICATEDrequest
requestNODE N
NGINX + PASSENGERRuby on Rails
Потребляемые ресурсы
● 8 машин 8 ядер Xeon 2GHz 16 GB RAM.● 40-50 passenger процессов на каждой
машине.
Проблемы данной реализации поискового движка
1. Высокий уровень потребления ресурсов;2. Зависимость от базы данных;3. Сложность управления потоком
выполнения задач;4. Сложность выкатки обновлений.
Проблемы разработки
● Высокий порог вхождения в проект;● Скорость разработки;● Объектно-ориентированный подход при
декомпозиции кода программы.
Конфигурируемость
Набор сайтов-партнеров (гейтов) для опроса определяется в зависимости от:● Геолокации пользователя;● Пунктов вылета и назначения;● Набора пассажиров;● Источника траффика;● Локали пользователя;
А также многих других параметров во всевозможных сочетаниях.Новые агентства добавлются в систему несколько раз в неделю. Правила выбора изменются несколько раз в час.
Новый поисковый движок “Ясень”
Ясень. DSLИспользуем функциональный подход при декомпозиции кода.
Строим систему из независимых компонентов - юнитов, которые:● Имеют один входной аргумент и один выходной аргумент;● Изолированы друг от друга;● Не имеют зависимостей от среды исполнения;● Могут быть легко протестированы.
params_validator
nabortu_gate
ozon_gate
mergeonetwotrip_gate
Ясень. Юниты
Ясень. Юниты
Взаимодействие с юнитом осуществляется по HTTP.Данные и файлы конфигурации закодированы в JSON.Каждый юнит поддерживает API:● Вызов;● Загрузка конфигурации;● Выгрузка конфигурации.
MultiplicationUnit
{"value": 100}
call
{"multiplier": 5} set_config
result
{"value": 500}
Ясень. Цепочки юнитовПоследовательные цепочки юнитов.
● Входной аргумент цепочки подается в первый юнит цепочки;● Если юнит возвращает None, последующие юниты не выполняются, None объявляется
результатом работы цепочки;● Результат работы юнита N передается в юнит N + 1;● Результатом работы цепочки является значение, возвращаемое последним юнитом.
params_validator ozon_gate add_airlines
Ясень. Цепочки юнитовПараллельные цепочки юнитов.
● Входной аргумент цепочки подается во все юниты цепочки;● Результаты работы всех юнитов собираются в массив;● Массив с результатами всех юнитов цепочки является результатом работы цепочки.
ozon_gate
trip_ru_gate
nabortu_gate
Ясень. Цепочки юнитовОтложенные цепочки.
● Выходным аргументом цепочки является входной аргумент цепочки;● Входной аргумент цепочки подается в первый юнит цепочки;● Результат работы юнита N подается на вход юниту N + 1.
save_search_params send_in_rabbitmq
Ясень. Цепочки юнитовПример композитной цепочки
validator merge
ozon_gate
nabortu_gate
sindbad_gate
send_to_queue
Parallel Sequential
Delayed
Ясень. Работа с даннымиТипы данных в системе:● Справочники - часто читаются, редко обновляются;
○ Информация об аэропортах;○ Информация об авиакомпаниях;○ Курсы валют.
● Логи - часто пишутся, редко читаются;○ Информация о поведении пользователей;○ Поиски;○ Переходы на покупку;
● Динамические данные - часто читаются, часто пишутся;○ Ссылки для переходов на страницу покупки;○ Результаты поиска;
Ясень. Работа с даннымиСправочники.● Небольние справочники (< 1mb) храним в памяти каждого рабочего
процесса;● Большие справочники храним в файловой базе данных kyotocabinet.
Файлы базы данных отображаются через mmap в адресное пространство рабочего процесса;
● Информация для справочников хранится в файловой системе. При обновлении файлов inotify уведомляет о необходимости обновить данные в рабочих процессах;
● Между нодами кластера файлы справочников распространяются lsyncd при помощи inotify.
Ясень. Работа с даннымиЛоги.● Рабочие процессы не могут писать данные в глобальное хранилище
непосредственно. В этом случае отказ глобального хранилища приведет к потере данных или повредит работоспособности приложения;
● Рабочие процессы складывают данные в локальное хранилище. Переносом данных в глобальное хранилище занимаются вспомогательные независимые процессы.
Ясень. Работа с даннымиДинамические данные.● Скорость доступа на чтение и запись критичны. Поэтому используем
in memory key-value хранилище;● Данные должны быть доступны со всех нод кластера;● Избыточность для обеспечения отказоустойчивости.
Ясень. Кластерная нода
Local Storage
MYSQL
REDIS REDIS
RabbitMQ
Ясень. Кластерная нодаДетали реализации.● Каждый рабочий процесс - это отдельный Tornado сервер (python 3,
tornado 3.2). Занимает в памяти 60mb;● Одна нода кластера 16 ядер Xeon 2GHz 16 GB RAM обрабатывает до
300 одновременных поисковых запросов;● Local storage - в первых версиях in memory redis. Сейчас kyotocabinet,
все данные на жестком диске.
Ясень. Кластер
Local Storage
MYSQL
REDIS REDIS
RabbitMQ
Local Storage
Ясень. Кластер
● 4 машины 16 ядер Xeon 2GHz 8GB RAM● Запас на случай пиковых нагрузок 40-50% уже в
указанной конфигурации● Потребяет в 4 раза меньше оперативной памяти
Ясень. Аварийные ситуации
Local Storage
REDIS REDIS
Ясень. Аварийные ситуации
Local Storage
MYSQL
REDIS
RabbitMQ
Ясень. Аварийные ситуации
Local Storage
MYSQL
RabbitMQ
Ясень. Аварийные ситуации
Local Storage
MYSQL
REDIS REDIS
RabbitMQ
Выводы1. Реализованная в поисковом движке “Ясень” архитектура лучше подходит для
решаемых задач с точки зрения надежности, потребления ресурсов и конфигурируемости;
2. Данная схема успешно используется в других проектах компании, таких как система аналитики партнерской сети TravelPayouts, движок рекламы мобильного приложения и прочих;
Но, необходимо помнить:1. Данная схема не является универсальной и применима далеко не для всех
задач;2. Отклоняясь от типовых решений и конфигураций, вы остаетесь один на один с
возникающими проблемами;3. Платой за надежность почти всегда служит усложнение инфраструктуры.
Спасибо за внимание
Recommended