«Лучшие предложения aviasales.ru, или как не упустить важное...

35
Лучшие предложения Aviasales.ru, или как не упустить важное среди 150 000 000 билетов в сутки. Антон Щербаков, Senior Backend Developer, Aviasales.ru

description

Антон Щербаков, Senior Backend Developer, Aviasales Выступление на hpc4.itmozg.ru (25 апреля 2013, Санкт-Петербург)

Transcript of «Лучшие предложения aviasales.ru, или как не упустить важное...

Page 1: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Лучшие предложения Aviasales.ru, или как не упустить важное среди 150 000 000 билетов в сутки.

Антон Щербаков, Senior Backend Developer, Aviasales.ru

Page 2: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Поисковый движок

Page 3: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Технологии реализации поискового движка

•  Ruby, Ruby on Rails; •  NGINX with Passenger; •  HAProxy; •  MySQL, Redis, MongoDB;

Page 4: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Нагрузка

•  200 000 поисковых запросов в сутки. •  250 запросов к MySQL в секунду, 300 запросов

к MongoDB в секунду. •  Исходящий трафик поискового движка – 25 Мбит. •  Десятки гигабайт json c билетами в сутки.

Page 5: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Сервисы Aviasales.ru

Page 6: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Полный стек технологий

Page 7: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Дополнительные сервисы Aviasales.ru

Aviasales.ru - поисковик дешевых авиабилетов.

Page 8: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Календарь минимальных цен

Page 9: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Карта минимальных цен

Page 10: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Лучшие предложения за последние 48 часов

Page 11: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Лучшие предложения за последние 48 часов

Page 12: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Рассылка минимальных цен

Page 13: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Рассылка минимальных цен

Page 14: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Рассылка минимальных цен

•  Большие возможности пользовательской настройки рассылки.

•  Письма отправляются сразу после

нахождения цены.

•  Ежедневно отправляется в среднем 35 тысяч писем.

Page 15: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Рассылка минимальных цен

•  DomainKeys Identified Mail (DKIM).

•  Sender Policy Framework (SPF).

•  Дополнительные заголовки письма (Precedence:bulk; X-List-Unsubscribe).

Page 16: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Задачи

•  Упрощение логики получения информации о минимальных ценах.

•  Упрощение схемы актуализации данных. •  Вынесение отдельных сервисов в целях

повышения отказоустойчивости системы.

Page 17: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Внутренняя организация системы хранения минимальных цен

Redis •  Богатая модель данных. •  Атомарные операции. •  Транзакции.

Page 18: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Сохранение минимальных цен

SETEX key: "economy:LED:BOJ:2013-06-01:2013-06-11:zero_weeks" value: "14612:1366179887:1666" expires_in: 172800 SETEX key: "economy:MOW:MCX:2013-05-02:2013-05-08:zero_week" value: "14050:1366179888:1534" expires_in: 86400

Page 19: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка данных для календаря

MGET "economy:LED:BOJ:2013-06-01:2013-06-11:zero_changes" "economy:LED:BOJ:2013-06-01:2013-06-11:one_change" "economy:LED:BOJ:2013-06-01:2013-06-11:two_changes" "economy:LED:BOJ:2013-06-01:2013-06-12:zero_changes" "economy:LED:BOJ:2013-06-01:2013-06-12:one_change" "economy:LED:BOJ:2013-06-01:2013-06-12:two_changes" "economy:LED:BOJ:2013-06-01:2013-06-13:zero_changes" "economy:LED:BOJ:2013-06-01:2013-06-13:one_change" "economy:LED:BOJ:2013-06-01:2013-06-13:two_changes"…

Page 20: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 21: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 22: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 23: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 24: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 25: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для сервиса лучших предложений

Page 26: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для карты

Page 27: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Загрузка минимальных цен для карты

Page 28: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Схема добавления данных в хранилище

1.  Сбор информации о минимальных ценах. 2.  Фильтрация. 3.  Сохранение цен в хранилище. 4.  Обновление соответствующих

упорядоченных наборов.

Page 29: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Схема добавления данных в хранилище

Page 30: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Схема добавления данных в хранилище

Page 31: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Нагрузка

•  3 000 000 минимальных цен в сутки. •  2000 команд Redis в секунду. •  700 000 запросов через API

минимальных цен в сутки.

Page 32: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Плюсы и минусы перехода на Redis

Плюсы: 1.  Упростилась схема работы с устаревшими

минимальными ценами. 2.  Упростилась логика выборки данных,

необходимых для успешной работы сервисов. 3.  Возросла производительность сервисов. 4.  Упростилось решение задачи постраничной

отрисовки цен. 5.  Отпала необходимость сортировки данных для

некоторых сервисов.

Page 33: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Плюсы и минусы перехода на Redis

Минусы: 1.  Значительные издержки потребления

оперативной памяти. 2.  Риск потери данных при отключении физической

машины.

Page 34: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Выводы

Page 35: «Лучшие предложения aviasales.ru, или как не упустить важное среди 150 миллионов билетов в сутки»

Спасибо за внимание!