SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
Дизайн поискового движка
aviasales.ru
http://avs.io/highload2013
Каплуновский Борис
bk@aviasales.ru
@bskaplou
facebook.com/boris.kaplounovsky
Agenda
Задачи метопоисковика авиабилетов
●
Предыдущек решение и его недостатки
●
Требования к новой системе
●
DSL “Ясеня” Юниты и цепочки
●
Отказоустойчивость и базы данных
●
Организация кластера
●
Что мы делаем?

Получаем запрос от пользвателя
Посылаем 60 запросов по 2 килобайта
Получаем 40 ответов по ~1 одному мегабайту
20 000 запросов в час
13 Гигабайт в минуту
~6000 проданных билетов в сутки (15 x Boeing 747)
Конфигурирование
Разные наборы гейтов в зависимости от:
●
Геоположения пользователя
●
Пунктов вылета и назначения
●
Набора пассажиров
●
Источника трафика
●
Локали пользователя
●
Работоспособности гейтов
●
Фазы луны
●
А также комбинаций всех вычеперечисленных параметров
Новые гейты подключаются по несколько раз в неделю
Правила выбора набора гейтов меняются по несколько раз в час
Как это было
●
●

Ruby Passenger

MySQL
Slave
●

Ruby Passenger

Ruby Passenger

●

MySQL
Master

●

Машинные ресурсы
Рабочий процесс занимает 300mb памяти
Занимающий ресурсы процесс 20 секунд
ничего не делает
Человеческие ресурсы
Запуск процесса RoR ~5-10 секунд
Высокая сложность системы, на введение в
проект нового программиста требовалось
несколько дней
Некоторые участки кода были “сложными
для модификации”. Этот код обычно
источал баги и тормоза
Функциональная декомпозиция вместо обьектной
ozon_gate
params_validator

eviterra_gate
airbaltic_gate

●
●
●
●

merge

{"s": [
"params_validator",
{"p": [
"ozon_gate",
"eviterra_gate",
"airbaltic_gate"
]},
"merge"
]}

Строим систему из независимых компонент которые:
Имеют один входной аргумент и один выходной аргумент
Изолированы друг от друга
Не имеют зависимостей от среды исполнения
Могут быть легко протестированы как внутри так и вне системы
Требования к системе
●

Простота разработки и низкий порог вхождения

●

Высокая отказоустойчивость

●

Хорошая масштабируемость

●

Простота конфигурирования
Примеры юнитов
from random import random
class Throttler:
def __init__(self):
self.config = 1
def __call__(self, request):
if random() <= self.config:
return request
else:
return None

class CurrencyRatesExtender:
def __init__(self):
self.config = {}
def __call__(self, request):
request['currency_rates'] = self.config
request['currency_rates']['rub'] = 1
return request
Юниты — рабочие лошадки системы
●
●
●

●
●
●
●
●

Обращаемся к любому юниту системы через http
{“price”: 100, “currency”: “usd”}
Для кодирования данных используем json
call
Каждый юнит имеет 3 url для
●
Вызова юнита
●
Загрузки конфигурации юнита {“usd”: 31.93, set_config
CurrencyConverterUnit
●
Выгрузки конфигурации юнита “eur”: 43.66}
Какие бывают юниты?
Запрос билетов у гейтов
Добавление в результат поисков информации об аэропортах
Удаление дубликатов предложений от разных агентств
Отправка данных в RabbitMQ
Расчёт цены в рублях для гейтов отдающих билеты в другой
валюте

{“price”: 3193, “currency”: “rub”}
Обьединяем юниты в цепочки
Последовательные Цепочки
●
Входной аргумента цепочки подаётся в первый юнит цепочки
●
Если юнит возвращает NIL последующие юниты не вызываются и NIL обьявляется
результатом работы цепочки
●
Результат работы первого юнита передаётся во второй юнит
●
Результат работа второго юнита передаётся в третий юнит
●
…
●
Результатом работы цепочки является значение возвращаемое последним юнитом
input
цеопчки
Sequential
eviterra_gate

add_airports

add_airlines

output
Что будет если?

0

+1

+5

?
Что будет если?

0

+1

+5

6
Обьединяем юниты в цепочки

●

●

●

Параллельные Цепочки
input
Входной аргумента цепочки подаётся во все
юниты цепочки
Результаты работы всех юнитов цепочки
собираются в массив
Массив с результатами работы всех юнитов
цепочки является результатом работы цепочки

Parallel

eviterra_gate
ozon_gate
clickavia_gate
output
Что будет если?

0

+1
+5

[? , ?]
Что будет если?

0

+1
+5

[1 , 5]
Обьединяем юниты в цепочки
●
●
●
●

Отложенные Цепочки
Выходным аргументом цепочки является входной аргумент цепочки
Входной аргумент цепочки подаётся в первый юнит цепочки
Результат работы первого юнита цепочки подаётся во второй юнит цепочки
And so on …

input
Delayed
send_to_rabbitmq

output
Что будет если?

0

+1

?

+5
Что будет если?

0

+1

0

+5
Пример сложного workflow
output
Sequential

input

Parallel
eviterra_gate
Delayed
airbaltic_gate
params_validator
ozon_gate
clickavia_gate

merge

send_to_queue
Что нам даёт DSL
Простота локальноый и удалённой отладки приложения
●
Контроль за скоростью выполнения юнитов и цепочек
●
Свобода менять модель выполнения цепочек
●
В одном процессе
●
В несколькких процессах
●
На нескольких машинах
●
У нас есть DSL для описания workflow!
Что дальше? Базы данных!
●

●

●

Типы данных
Справочники – часто читаются, редко обновляются
●
Курсы валют
●
Аэропорты
●
Авиакомпании
Логи – часто пишутся, редко читаются
●
Поиски
●
Клики
●
Информация о поведении пользователей
Динамические данные – часто читаются, часто пишутся
●
Ссылки для переходов на страницу покупки
●
Результаты поиска
Справочники
●

●

●

●

Небольшие справочники храним в памяти
каждого рабочего процесса
Если справочник большой >1mb складываем
его в файловую базу данных (kyotocabinet).
Файл базы данных mmapится в адресное
пространство всех рабочих процессов ноды
Информация для справочников хранится на
файловой системе, при обновлении файлов
через inotify данные закидываются в рабоче
процессы
Между нодами файлы со справочниками
раскидываются lsyncd (inotify)
Логи
●

●

Рабочие процессы не могут писать данные в
глобальное хранилище непосредственно – в
этом случае отказ хранилища повредит
работоспособности приложения или приведёт к
потере данных
Пусть рабочие процессы складывают данные в
локальное хранилище в пределах ноды, и
перетаскивают данные в общее хранилище по
мере возможности
Динамическе данные
●

●

●

●

Скорость доступа и на чтение и на запись
критичны
Данные должны быть одинаково доступны со
всех нод кластера
In-memory key-value хранилище – ничего
быстрее быть не может!
Избыточность для обеспечения
отказоустойчивости
Детали Реализации и производительность

●
●
●
●
●

●
●

Язык программирования Python 3
(
)
Цепочки и юниты внутри цепочек исполняются асинхронно с помощью Tornado
Парсер xml - lxml
Файловая база данных kyotocabinet
Локальное хранилище данных redis
Рабочий процесс занимает 60mb ram
Виртуальная машина 8 ядер 16gb обрабатывает до 150 поисковых запросов
одновременно
Рабочие процессы
●

●

●

На ноде живут
Пчёлы
●
Обрабатывают запросы пользователей
●
Пишут только в local strage
●
Могут читать из глобального хранилища
Муравьи
●
Переносят данные из локального
хранилища во внешние
(rabbitmq/redis/mysql)
Local Storage
●
Хранилище способное придержать
данные до восстановления
работоспособности внешних хранилищ

Local
Storage

Redis

Redis

MySQL
Write Only
Storage

RabbitMQ
Что может пойти не так?

●

●

Отказ MySQL/RabbitMQ
Данные сохраняются в local
storage до восстановления
работоспособности
внешних серверов
После восстановленя
муравьи перенесут данные

Local
Storage

Redis

Redis

MySQL
Write Only
Storage
Что может пойти не так?

●

●

Отказ Redis
И запись и чтение
осуществляются в оба redis
одновременно
Если один из серверов
выходит из строя второй
берёт нагрузку на себя

Local
Storage

Redis

MySQL
Write Only
Storage

RabbitMQ
Что может пойти не так?

●

●

Отказ Всех Redis
Пчёлы не смогут читать
данные и часть запросов не
будет работать
Данные не потеряются, как
только сервера redis
восстановятся муравье
перетещут туда данные

Local
Storage

Redis

MySQL
Write Only
Storage

RabbitMQ
Что может пойти не так?
Local
Storage

●

●

Отказ LocalStorage
Нода целиком выводится из
кластера
Нагрузка распределяется
по остальным нодам
кластера

Redis

Local
Storage

Redis

MySQL
Write Only
Storage
Local
Storage

RabbitMQ
Ясень и все все все

Local
Storage

Redis

Redis

MySQL
Write Only
Storage

RabbitMQ
Итого
●

●

●

●

●
●
●

Юниты и цепочки могут быть независимо
сконфигурированы в рантайме
Среда исполнения позволяет контролировать скорость
выполнения юнитов и цепочек
Отладка системы осуществляется через http, просто и
наглядно
Разработка юнитов не требует специальной подготовки и
даже знакомства с “Ясенем”
Скорость запуска системы 0.1 секунды
Сократили количество серверов в два раза
Код в ясень пишут программисты из соседних проектов
Q&A
Модели исполнения
●

●

Sequential

Точки распараллеливания
- Отложенные цепочки
- Параллельные цепочки

Выполнение параллельных
операций:
- В разных потоках
- В разных процессах
- Асинхронное выполнение
- На разных серверах

Delayed

Parallel
Почему HTTP? Почему JSON?
●
●

●
●
●
●

●

Возможность работать с системой с любого компьютера где есть браузер
Если нет браузера то достаточно curl
Хорошая производительность библиотек работы с JSON
Возможность править конфигурацию в текстовом редакторе
Универсальный UI для редактирования JSON
Если конфигурация сложна – создаём специализированный редактор
Веб приложение обязано работать по протоколу HTTP, зачем искать что-то
ещё?
Почему так не могло продолжаться
●

●

●

●
●

●

Мы теряли деньги когда
MySQL выходил из строя или был
перегружен запросами
Под нагрузкой окзывалось что в новой
версии Rails тормоза
Нас показывали по первому каналу и люди
начинали искать билеты
Деплоились в штатном режиме
Для внесения изменений в систему
требовалась работа программистов
Passenger ы начинали массово
рестартовать под нагрузкой

Weitere ähnliche Inhalte

Was ist angesagt?

Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Ontico
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Ontico
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на SphinxRoman Pavlushko
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ontico
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Ontico
 
Jinba - frontendconf.ru/2015
Jinba - frontendconf.ru/2015Jinba - frontendconf.ru/2015
Jinba - frontendconf.ru/2015Pavel Dovbush
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеAlexandr Krasheninnikov
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonSlach
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереBadoo Development
 
Мониторинг всех слоев web проекта (hl2015)
Мониторинг всех слоев web проекта (hl2015)Мониторинг всех слоев web проекта (hl2015)
Мониторинг всех слоев web проекта (hl2015)Nikolay Sivko
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примереSergey Xek
 
Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Eugene Chekan
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Pavel Dovbush
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksRoman Pavlushko
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)Ontico
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013Roman Pavlushko
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанкуNikolay Sivko
 

Was ist angesagt? (20)

Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на Sphinx
 
Avito Stachka 2012
Avito Stachka 2012Avito Stachka 2012
Avito Stachka 2012
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
 
Jinba - frontendconf.ru/2015
Jinba - frontendconf.ru/2015Jinba - frontendconf.ru/2015
Jinba - frontendconf.ru/2015
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
 
Мониторинг всех слоев web проекта (hl2015)
Мониторинг всех слоев web проекта (hl2015)Мониторинг всех слоев web проекта (hl2015)
Мониторинг всех слоев web проекта (hl2015)
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примере
 
Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 
pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
 

Ähnlich wie Борис Каплуновский, Aviasales.ru

Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеBadoo Development
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеYulia Kotova
 
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Ontico
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploykuchinskaya
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данныхSiel01
 
Gnevshev мониторинг
Gnevshev   мониторингGnevshev   мониторинг
Gnevshev мониторингkuchinskaya
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeARCCN
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Yandex
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow Vadim Nesterov
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Ontico
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
High Load 2009 Imdg Presentation
High Load 2009   Imdg PresentationHigh Load 2009   Imdg Presentation
High Load 2009 Imdg PresentationHighLoad2009
 
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP                PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP Анна Магас
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Badoo Development
 

Ähnlich wie Борис Каплуновский, Aviasales.ru (20)

Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploy
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
 
Gnevshev мониторинг
Gnevshev   мониторингGnevshev   мониторинг
Gnevshev мониторинг
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
2056
20562056
2056
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network Initiative
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
High Load 2009 Imdg Presentation
High Load 2009   Imdg PresentationHigh Load 2009   Imdg Presentation
High Load 2009 Imdg Presentation
 
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP                PUG #9 at OWOX: Поиск узких мест в приложении на PHP
PUG #9 at OWOX: Поиск узких мест в приложении на PHP
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 

Mehr von Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

Mehr von Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Борис Каплуновский, Aviasales.ru

  • 2. Agenda Задачи метопоисковика авиабилетов ● Предыдущек решение и его недостатки ● Требования к новой системе ● DSL “Ясеня” Юниты и цепочки ● Отказоустойчивость и базы данных ● Организация кластера ●
  • 3. Что мы делаем? Получаем запрос от пользвателя Посылаем 60 запросов по 2 килобайта Получаем 40 ответов по ~1 одному мегабайту 20 000 запросов в час 13 Гигабайт в минуту ~6000 проданных билетов в сутки (15 x Boeing 747)
  • 4. Конфигурирование Разные наборы гейтов в зависимости от: ● Геоположения пользователя ● Пунктов вылета и назначения ● Набора пассажиров ● Источника трафика ● Локали пользователя ● Работоспособности гейтов ● Фазы луны ● А также комбинаций всех вычеперечисленных параметров Новые гейты подключаются по несколько раз в неделю Правила выбора набора гейтов меняются по несколько раз в час
  • 5. Как это было ● ● Ruby Passenger MySQL Slave ● Ruby Passenger Ruby Passenger ● MySQL Master ● Машинные ресурсы Рабочий процесс занимает 300mb памяти Занимающий ресурсы процесс 20 секунд ничего не делает Человеческие ресурсы Запуск процесса RoR ~5-10 секунд Высокая сложность системы, на введение в проект нового программиста требовалось несколько дней Некоторые участки кода были “сложными для модификации”. Этот код обычно источал баги и тормоза
  • 6. Функциональная декомпозиция вместо обьектной ozon_gate params_validator eviterra_gate airbaltic_gate ● ● ● ● merge {"s": [ "params_validator", {"p": [ "ozon_gate", "eviterra_gate", "airbaltic_gate" ]}, "merge" ]} Строим систему из независимых компонент которые: Имеют один входной аргумент и один выходной аргумент Изолированы друг от друга Не имеют зависимостей от среды исполнения Могут быть легко протестированы как внутри так и вне системы
  • 7. Требования к системе ● Простота разработки и низкий порог вхождения ● Высокая отказоустойчивость ● Хорошая масштабируемость ● Простота конфигурирования
  • 8. Примеры юнитов from random import random class Throttler: def __init__(self): self.config = 1 def __call__(self, request): if random() <= self.config: return request else: return None class CurrencyRatesExtender: def __init__(self): self.config = {} def __call__(self, request): request['currency_rates'] = self.config request['currency_rates']['rub'] = 1 return request
  • 9. Юниты — рабочие лошадки системы ● ● ● ● ● ● ● ● Обращаемся к любому юниту системы через http {“price”: 100, “currency”: “usd”} Для кодирования данных используем json call Каждый юнит имеет 3 url для ● Вызова юнита ● Загрузки конфигурации юнита {“usd”: 31.93, set_config CurrencyConverterUnit ● Выгрузки конфигурации юнита “eur”: 43.66} Какие бывают юниты? Запрос билетов у гейтов Добавление в результат поисков информации об аэропортах Удаление дубликатов предложений от разных агентств Отправка данных в RabbitMQ Расчёт цены в рублях для гейтов отдающих билеты в другой валюте {“price”: 3193, “currency”: “rub”}
  • 10. Обьединяем юниты в цепочки Последовательные Цепочки ● Входной аргумента цепочки подаётся в первый юнит цепочки ● Если юнит возвращает NIL последующие юниты не вызываются и NIL обьявляется результатом работы цепочки ● Результат работы первого юнита передаётся во второй юнит ● Результат работа второго юнита передаётся в третий юнит ● … ● Результатом работы цепочки является значение возвращаемое последним юнитом input цеопчки Sequential eviterra_gate add_airports add_airlines output
  • 13. Обьединяем юниты в цепочки ● ● ● Параллельные Цепочки input Входной аргумента цепочки подаётся во все юниты цепочки Результаты работы всех юнитов цепочки собираются в массив Массив с результатами работы всех юнитов цепочки является результатом работы цепочки Parallel eviterra_gate ozon_gate clickavia_gate output
  • 16. Обьединяем юниты в цепочки ● ● ● ● Отложенные Цепочки Выходным аргументом цепочки является входной аргумент цепочки Входной аргумент цепочки подаётся в первый юнит цепочки Результат работы первого юнита цепочки подаётся во второй юнит цепочки And so on … input Delayed send_to_rabbitmq output
  • 20. Что нам даёт DSL Простота локальноый и удалённой отладки приложения ● Контроль за скоростью выполнения юнитов и цепочек ● Свобода менять модель выполнения цепочек ● В одном процессе ● В несколькких процессах ● На нескольких машинах ●
  • 21. У нас есть DSL для описания workflow! Что дальше? Базы данных! ● ● ● Типы данных Справочники – часто читаются, редко обновляются ● Курсы валют ● Аэропорты ● Авиакомпании Логи – часто пишутся, редко читаются ● Поиски ● Клики ● Информация о поведении пользователей Динамические данные – часто читаются, часто пишутся ● Ссылки для переходов на страницу покупки ● Результаты поиска
  • 22. Справочники ● ● ● ● Небольшие справочники храним в памяти каждого рабочего процесса Если справочник большой >1mb складываем его в файловую базу данных (kyotocabinet). Файл базы данных mmapится в адресное пространство всех рабочих процессов ноды Информация для справочников хранится на файловой системе, при обновлении файлов через inotify данные закидываются в рабоче процессы Между нодами файлы со справочниками раскидываются lsyncd (inotify)
  • 23. Логи ● ● Рабочие процессы не могут писать данные в глобальное хранилище непосредственно – в этом случае отказ хранилища повредит работоспособности приложения или приведёт к потере данных Пусть рабочие процессы складывают данные в локальное хранилище в пределах ноды, и перетаскивают данные в общее хранилище по мере возможности
  • 24. Динамическе данные ● ● ● ● Скорость доступа и на чтение и на запись критичны Данные должны быть одинаково доступны со всех нод кластера In-memory key-value хранилище – ничего быстрее быть не может! Избыточность для обеспечения отказоустойчивости
  • 25. Детали Реализации и производительность ● ● ● ● ● ● ● Язык программирования Python 3 ( ) Цепочки и юниты внутри цепочек исполняются асинхронно с помощью Tornado Парсер xml - lxml Файловая база данных kyotocabinet Локальное хранилище данных redis Рабочий процесс занимает 60mb ram Виртуальная машина 8 ядер 16gb обрабатывает до 150 поисковых запросов одновременно
  • 26. Рабочие процессы ● ● ● На ноде живут Пчёлы ● Обрабатывают запросы пользователей ● Пишут только в local strage ● Могут читать из глобального хранилища Муравьи ● Переносят данные из локального хранилища во внешние (rabbitmq/redis/mysql) Local Storage ● Хранилище способное придержать данные до восстановления работоспособности внешних хранилищ Local Storage Redis Redis MySQL Write Only Storage RabbitMQ
  • 27. Что может пойти не так? ● ● Отказ MySQL/RabbitMQ Данные сохраняются в local storage до восстановления работоспособности внешних серверов После восстановленя муравьи перенесут данные Local Storage Redis Redis MySQL Write Only Storage
  • 28. Что может пойти не так? ● ● Отказ Redis И запись и чтение осуществляются в оба redis одновременно Если один из серверов выходит из строя второй берёт нагрузку на себя Local Storage Redis MySQL Write Only Storage RabbitMQ
  • 29. Что может пойти не так? ● ● Отказ Всех Redis Пчёлы не смогут читать данные и часть запросов не будет работать Данные не потеряются, как только сервера redis восстановятся муравье перетещут туда данные Local Storage Redis MySQL Write Only Storage RabbitMQ
  • 30. Что может пойти не так? Local Storage ● ● Отказ LocalStorage Нода целиком выводится из кластера Нагрузка распределяется по остальным нодам кластера Redis Local Storage Redis MySQL Write Only Storage Local Storage RabbitMQ
  • 31. Ясень и все все все Local Storage Redis Redis MySQL Write Only Storage RabbitMQ
  • 32. Итого ● ● ● ● ● ● ● Юниты и цепочки могут быть независимо сконфигурированы в рантайме Среда исполнения позволяет контролировать скорость выполнения юнитов и цепочек Отладка системы осуществляется через http, просто и наглядно Разработка юнитов не требует специальной подготовки и даже знакомства с “Ясенем” Скорость запуска системы 0.1 секунды Сократили количество серверов в два раза Код в ясень пишут программисты из соседних проектов
  • 33. Q&A
  • 34. Модели исполнения ● ● Sequential Точки распараллеливания - Отложенные цепочки - Параллельные цепочки Выполнение параллельных операций: - В разных потоках - В разных процессах - Асинхронное выполнение - На разных серверах Delayed Parallel
  • 35. Почему HTTP? Почему JSON? ● ● ● ● ● ● ● Возможность работать с системой с любого компьютера где есть браузер Если нет браузера то достаточно curl Хорошая производительность библиотек работы с JSON Возможность править конфигурацию в текстовом редакторе Универсальный UI для редактирования JSON Если конфигурация сложна – создаём специализированный редактор Веб приложение обязано работать по протоколу HTTP, зачем искать что-то ещё?
  • 36. Почему так не могло продолжаться ● ● ● ● ● ● Мы теряли деньги когда MySQL выходил из строя или был перегружен запросами Под нагрузкой окзывалось что в новой версии Rails тормоза Нас показывали по первому каналу и люди начинали искать билеты Деплоились в штатном режиме Для внесения изменений в систему требовалась работа программистов Passenger ы начинали массово рестартовать под нагрузкой