Конференция разработчиков
высоконагруженных систем
Хочу быть в курсе событий!
Главная → 2013 → Архитектуры
Дизайн движка метапоиска 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.
Требования к отказоустойчивости заставили нас пересмотреть способы работы с базами данных, применявшиеся ранее. Данные были разбиты на три типа:
- справочники - данные, которые постоянно читаются приложением, но довольно редко обновляются (информация об аэропортах, городах странах, авиакомпаниях);
- логи - данные, которые постоянно пишутся, но никогда не читаются из приложения (информация о поисковых запросах, кликах, поведении пользователей);
- динамика - данные с коротким временем жизни, которые активно пишутся и читаются (информация о поисках, переходах на сайты агентств).
Для разных типов данных были разработаны разные техники обеспечения отказоустойчивости.
Получившаяся система позволила сократить парк машин в три раза, упростила подключение новых сервисов и значительно повысила предсказуемость работы системы.