Доменно специфичные базы данных и рассылка Aviasales,...
description
Transcript of Доменно специфичные базы данных и рассылка Aviasales,...
![Page 1: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/1.jpg)
Доменно специфичные базы данных и рассылка @aviasalesКаплуновский Борис
![Page 2: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/2.jpg)
● Что делает aviasales ● Что делает рассылка aviasales● Зачем нам Domain Specific Database● Детали реализации фильтрующего дерева● Ограничения решения● Масштабирование решения
Agenda
![Page 3: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/3.jpg)
Что делает aviasales
![Page 4: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/4.jpg)
Фильтры рассылки
Пункты вылета/назначения
Стоимость билетов
Даты вылета/прилёта
Страна назначения
Месяца вылета/прилёта
Длительность прибывания
Количество пересадок
Предпочитаемые авиакомпании
Аэропорты пересадок
Номера рейсов
![Page 5: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/5.jpg)
Движок рассылки должен● 1 000 000 раз в сутки● Проверить 1mb документ● На соответствие ~1 000 000 предикатам И не вспотеть!
![Page 6: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/6.jpg)
Структура документаРезультаты поиска
Курсы Валют
Информация о OTA
Информация о Аэропортах
Предложения
Предложение
Цена OTA 1 Цена OTA 2
Сегмент 1
Перелёт 1
HKT HKG
Перелёт 1
HKG DME
Сегмент 2
Перелёт 1
DME BKK
Перелёт 1
BKK HKT
![Page 7: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/7.jpg)
Структура подписок
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)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/8.jpg)
Требования к базе данных
● Проверка на соответствие документа всем предикатам за <50ms
● Низкое потребление ресурсов● Простота интеграции● Расширяемость● Масштабируемость
![Page 9: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/9.jpg)
Почему не подходит SQL
● Неоднородные наборы предикатов● Нетипичные для SQL входные данные –
огромное дерево● Инверсия логики:
● В SQL хранят данные и выбирают данные соответствующие предикатам запроса
● Для рассылки в базе надо хранить предикаты и проверять соответсвие пришедших данных предикатам
![Page 10: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/10.jpg)
Ловушки: Протокол взаимодействия● Программисты любят придумывать новые
протоколы mysql/postgres/redis/memcached
● Изобретение протокола - трата времени● Протоколы на все случаи уже изобретены
![Page 11: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/11.jpg)
Протокол взаимодействия HTTP● Не надо писать клиент и сервер
● Удобно дебажить и тестировать
● Проксируется балансируется кешируется
● Существуют реализации для всего
![Page 12: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/12.jpg)
Ловушка: низкоуровневый язык● Реализация на Java/C/Go/Erlang чтобы
быстро работало!
● Скорость - следствие хороших алгоритмов, а не языка
● Низкоуровневые языки громоздки● Их сложно отлаживать
![Page 13: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/13.jpg)
Язык реализации Python
( )
● Можно быстро написать прототип и проверить эффективность алгоритмов
● Много сторонних библиотек● Компактный и читаемый код
![Page 14: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/14.jpg)
Ловушка: одно решение для всего● Программисты любят разрабатывать
комбайны решающие все проблемы на земле
● Потеря фокуса● Сложно заставить комбайн решать все
задачи одинаково хорошо● Создание комбайнов ВСЕГДА приводит
к долгострою
![Page 15: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/15.jpg)
Структура подписки
orig='MOW' and dest='HKT' and price<4000
Дизьюнкт Свойство документа
Константа
Булевый оператор
![Page 16: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/16.jpg)
Структура подписки
orig='MOW' and dest='HKT' and price<4000
● У свойств документа разная сложность вычисления● Оператор = проще операторов <,>● Порядок вычисления дизьюнктов не оказывает
влияния на результат
![Page 17: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/17.jpg)
Структура подписки
if (dest='HKT')then if(orig='MOW') then if(price<4000) match
● Свойства документа вычисляются лениво● Пытаемся как можно раньше отсеять как можно
больше поддеревьев● Переупорядочивание дизьюнктов позволяет экономить
ресурсы
![Page 18: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/18.jpg)
Дешевле проверка выше приоритет = < >
Больше урезается дерево выше приоритет
ORIGIN, DATEПроще расчитывается значение
свойства выше приоритORIGIN, PRICE
Приоритеты операций
![Page 19: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/19.jpg)
ЦЕНА <
10000 15000 15500 15700
ВРЕМЯ ПЕРЕСАДКИ >
80мин 95мин 110мин 200мин
свойства + предикаты = узлы дерева
Свойства
Оператор
Константы
![Page 20: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/20.jpg)
node
op – string “”
children – hash {} sorted_keys - array []
property – string “”
Устройство дерева
![Page 21: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/21.jpg)
leaf
callback_url – string “”parent - *
Устройство дерева
![Page 22: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/22.jpg)
Дерево поиска
orig =
MOW LED HKT
HKT
BKK
![Page 23: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/23.jpg)
Дерево поиска
price <
10000 20000 30000 40000
22000
![Page 24: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/24.jpg)
Результаты поиска
Курсы Валют
Информация о OTA
Информация о Аэропортах
Предложения
1 Пересадка 3 Пересадки 0 Пересадок
Количество пересадок <
0 1 2 3
Фильтрующие свойства
![Page 25: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/25.jpg)
Фильтрующие свойства
Результаты поиска
Курсы Валют
Информация о OTA
Информация о Аэропортах
Предложения
1 Пересадка 3 Пересадки 0 Пересадок
Количество пересадок <0 1 2 3
![Page 26: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/26.jpg)
Небольшие уловки
● Все подписки имеют ссылку на родителя для ускорения операции удаления
● Рядом с деревом хранится сортированный массив сслылок на все листья дерева для ускорения операции удаления из дерева
● Результат вычисления свойств документа кешируется
![Page 27: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/27.jpg)
TRFfast in-memory DSD
RailsAppsubscription interface
RailsAppmail composer & sender
SMTP Server
MySQL
Как выглядит система в сборе
![Page 28: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/28.jpg)
Масштабирование по кличеству обрабатываемых документов
Tree1 Tree2
Rules Documents
● Правила вставляются в оба дерева● Обрабатываемый документ отправляется в одно из
деревьев
![Page 29: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/29.jpg)
Масштабирование по кличеству предикатов в дереве
● Правила вставляются в одно из деревьев● Обрабатываемый документ отправляется в оба дерева
Tree1 Tree2
Rules Documents
![Page 30: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/30.jpg)
Ограничения решения
● Алгоритм становится неэффективным если один документ подходит для значительной части дерева
● Дерево хранит данные в памяти, сохранность данных обеспечивается внешними средствами
● Для добавления новых свойств документа нужен перезапуск дерева
![Page 31: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/31.jpg)
Что получилось: технологии
● Два процесса● Два ядра CPU● 1.5gb Памяти● 1 000 000 документов в сутки● 150K Писем в день● Время ответа базы в среднем 28ms
![Page 32: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/32.jpg)
Что получилось: бизнес
● Продукт был запущен через два месяца после начала разработки
● Проект окупился в течении двух месяцев после запуска
● Технология открыла дорогу новым фичам продукта
![Page 33: Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Aviasales)](https://reader034.fdocument.pub/reader034/viewer/2022042518/5585babdd8b42a5e5a8b4c7e/html5/thumbnails/33.jpg)
The End :(