Transcript
Page 1: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Доменно специфичные базы данных и рассылка @aviasalesКаплуновский Борис

Page 2: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

● Что делает aviasales ● Что делает рассылка aviasales● Зачем нам Domain Specific Database● Детали реализации фильтрующего дерева● Ограничения решения● Масштабирование решения

Agenda

Page 3: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Что делает aviasales

Page 4: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Фильтры рассылки

Пункты вылета/назначения

Стоимость билетов

Даты вылета/прилёта

Страна назначения

Месяца вылета/прилёта

Длительность прибывания

Количество пересадок

Предпочитаемые авиакомпании

Аэропорты пересадок

Номера рейсов

Page 5: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Движок рассылки должен● 1 000 000 раз в сутки● Проверить 1mb документ● На соответствие ~1 000 000 предикатам И не вспотеть!

Page 6: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Структура документаРезультаты поиска

Курсы Валют

Информация о OTA

Информация о Аэропортах

Предложения

Предложение

Цена OTA 1 Цена OTA 2

Сегмент 1

Перелёт 1

HKT HKG

Перелёт 1

HKG DME

Сегмент 2

Перелёт 1

DME BKK

Перелёт 1

BKK HKT

Page 7: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Структура подписок

orig='MOW' and dest='HKT' and price<40000

orig='MOW' and dest_country='US' and price<60000

orig='LED' and switch_count<2 and price<2000

orig='LED' and 'CDG' in switch_airports

И подобных выражений сотни тысяч...

Page 8: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Требования к базе данных

● Проверка на соответствие документа всем предикатам за <50ms

● Низкое потребление ресурсов● Простота интеграции● Расширяемость● Масштабируемость

Page 9: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Почему не подходит SQL

● Неоднородные наборы предикатов● Нетипичные для SQL входные данные –

огромное дерево● Инверсия логики:

● В SQL хранят данные и выбирают данные соответствующие предикатам запроса

● Для рассылки в базе надо хранить предикаты и проверять соответсвие пришедших данных предикатам

Page 10: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Ловушки: Протокол взаимодействия● Программисты любят придумывать новые

протоколы mysql/postgres/redis/memcached

● Изобретение протокола - трата времени● Протоколы на все случаи уже изобретены

Page 11: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Протокол взаимодействия HTTP● Не надо писать клиент и сервер

● Удобно дебажить и тестировать

● Проксируется балансируется кешируется

● Существуют реализации для всего

Page 12: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Ловушка: низкоуровневый язык● Реализация на Java/C/Go/Erlang чтобы

быстро работало!

● Скорость - следствие хороших алгоритмов, а не языка

● Низкоуровневые языки громоздки● Их сложно отлаживать

Page 13: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Язык реализации Python

( )

● Можно быстро написать прототип и проверить эффективность алгоритмов

● Много сторонних библиотек● Компактный и читаемый код

Page 14: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Ловушка: одно решение для всего● Программисты любят разрабатывать

комбайны решающие все проблемы на земле

● Потеря фокуса● Сложно заставить комбайн решать все

задачи одинаково хорошо● Создание комбайнов ВСЕГДА приводит

к долгострою

Page 15: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Структура подписки

orig='MOW' and dest='HKT' and price<4000

Дизьюнкт Свойство документа

Константа

Булевый оператор

Page 16: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Структура подписки

orig='MOW' and dest='HKT' and price<4000

● У свойств документа разная сложность вычисления● Оператор = проще операторов <,>● Порядок вычисления дизьюнктов не оказывает

влияния на результат

Page 17: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Структура подписки

if (dest='HKT')then if(orig='MOW') then if(price<4000) match

● Свойства документа вычисляются лениво● Пытаемся как можно раньше отсеять как можно

больше поддеревьев● Переупорядочивание дизьюнктов позволяет экономить

ресурсы

Page 18: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Дешевле проверка выше приоритет = < >

Больше урезается дерево выше приоритет

ORIGIN, DATEПроще расчитывается значение

свойства выше приоритORIGIN, PRICE

Приоритеты операций

Page 19: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

ЦЕНА <

10000 15000 15500 15700

ВРЕМЯ ПЕРЕСАДКИ >

80мин 95мин 110мин 200мин

свойства + предикаты = узлы дерева

Свойства

Оператор

Константы

Page 20: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

node

op – string “”

children – hash {} sorted_keys - array []

property – string “”

Устройство дерева

Page 21: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

leaf

callback_url – string “”parent - *

Устройство дерева

Page 22: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Дерево поиска

orig =

MOW LED HKT

HKT

BKK

Page 23: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Дерево поиска

price <

10000 20000 30000 40000

22000

Page 24: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Результаты поиска

Курсы Валют

Информация о OTA

Информация о Аэропортах

Предложения

1 Пересадка 3 Пересадки 0 Пересадок

Количество пересадок <

0 1 2 3

Фильтрующие свойства

Page 25: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Фильтрующие свойства

Результаты поиска

Курсы Валют

Информация о OTA

Информация о Аэропортах

Предложения

1 Пересадка 3 Пересадки 0 Пересадок

Количество пересадок <0 1 2 3

Page 26: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Небольшие уловки

● Все подписки имеют ссылку на родителя для ускорения операции удаления

● Рядом с деревом хранится сортированный массив сслылок на все листья дерева для ускорения операции удаления из дерева

● Результат вычисления свойств документа кешируется

Page 27: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

TRFfast in-memory DSD

RailsAppsubscription interface

RailsAppmail composer & sender

SMTP Server

MySQL

Как выглядит система в сборе

Page 28: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Масштабирование по кличеству обрабатываемых документов

Tree1 Tree2

Rules Documents

● Правила вставляются в оба дерева● Обрабатываемый документ отправляется в одно из

деревьев

Page 29: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Масштабирование по кличеству предикатов в дереве

● Правила вставляются в одно из деревьев● Обрабатываемый документ отправляется в оба дерева

Tree1 Tree2

Rules Documents

Page 30: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Ограничения решения

● Алгоритм становится неэффективным если один документ подходит для значительной части дерева

● Дерево хранит данные в памяти, сохранность данных обеспечивается внешними средствами

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

Page 31: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Что получилось: технологии

● Два процесса● Два ядра CPU● 1.5gb Памяти● 1 000 000 документов в сутки● 150K Писем в день● Время ответа базы в среднем 28ms

Page 32: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

Что получилось: бизнес

● Продукт был запущен через два месяца после начала разработки

● Проект окупился в течении двух месяцев после запуска

● Технология открыла дорогу новым фичам продукта

Page 33: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)

The End :(


Top Related