HighLoad++ 2015 завершён! Ждём вас в 2016 году!

Профессиональная конференция разработчиков высоконагруженных систем

2 и 3 ноября 2015 Крокус-Экспо МОСКВА
Профессиональная конференция разработчиков высоконагруженных систем

Дизайн движка метапоиска Aviasales
Архитектуры

Доклад принят в Программу конференции
aviasales.ru

CTO AviaSales.ru, более 10 лет в индустрии, программирует на всём, что компилируется и интерпретируется. Работал в Sun Microsystems и Intel, но в 2011 году ушёл в небольшую компанию AviaSales за настоящим драйвом и новыми технологиями.

Тезисы

- AviaSales - метапоисковик авиабилетов. Для обработки одного поискового запроса наш сервис опрашивает от одного до четырех десятков внешних сервисов и обрабатывает их ответы. Ответ одного сервиса - это от 200 до 2000 килобайт XML/JSON. От скорости обработки этих данных напрямую зависит прибыль компании.
- Для эффективной работы с API удалённых сервисов и быстрой параллельной обработки данных был разработан движок "Ясень".
Среди требований, предъявляемых к системе:
- высокая отказоустойчивость;
- лёгкая масштабируемость;
- "горячее" развертывание (deploy);
- простота конфигурирования;
- низкий порог вхождения для программистов

В рамках обработки одного поискового запроса необходимо отослать запросы и обработать результаты от большого набора внешних API, эти запросы необходимо выполнять параллельно. Кроме параллельного исполнения модулей, требуется последовательное исполнение. Часть обработки данных также можно осуществлять уже после отдачи данных пользователю - это отложенное исполнение. Из трёх названных конструкций (parallel/sequential/delayed) состоит DSL, используемый в "Ясене". Из независимых и изолированных модулей (юнитов) с помощью DSL строится workflow. Типичный workflow состоит из 10-100 юнитов, объединённых в последовательные, параллельные и отложенные цепочки.

Необходимость быстро реагировать на отзывы пользователей и показатели работы внешних сервисов влияет на требования к простоте конфигурирования системы. Такие вещи,как изменения наценки на билеты для разных поставщиков, регулирование набора агентств для поиска в зависимости от локали пользователя, источника траффика, географического положения пользователя и многих других факторов, необходимо делать в runtime и без помощи технических специалистов. Для решения этой проблемы workflow в "Ясене" строится из юнитов, каждый из которых имеет URL для получения текущей конфигурации юнита и её обновления. Для упрощения разработки юнитов и их тестирования кроме URL-конфигурирования каждый юнит может быть вызван через HTTP. В взаимодействие с юнитами происходит по HTTP, данные кодируем в json.

Требования к отказоустойчивости заставили нас пересмотреть способы работы с базами данных, применявшиеся ранее. Данные были разбиты на три типа:
- справочники - данные, которые постоянно читаются приложением, но довольно редко обновляются (информация об аэропортах, городах странах, авиакомпаниях);
- логи - данные, которые постоянно пишутся, но никогда не читаются из приложения (информация о поисковых запросах, кликах, поведении пользователей);
- динамика - данные с коротким временем жизни, которые активно пишутся и читаются (информация о поисках, переходах на сайты агентств).

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

Получившаяся система позволила сократить парк машин в три раза, упростила подключение новых сервисов и значительно повысила предсказуемость работы системы.

Другие доклады секции
Архитектуры

Rambler's Top100