Happydev presentation soa
-
Upload
ant-pl -
Category
Technology
-
view
399 -
download
1
description
Transcript of Happydev presentation soa
Переход к SoA архитектуре
Антон Плешивцев twitter.com/allaud github.com/allaud
aviasales.ru
Как это работает?
Intro• 20 000 запросов в час • 13 гигабайт данных в минуту • 6000+ билетов в сутки • 60 одновременных запросов
Legacy• 1 RoR приложение • Множество функций • Поиск • Сбор статистики • Сбор информации о ценах • Рассылки • …
RoR search• 350 mb памяти на процесс • Blocking io • Запуск Rails-приложения до 15 секунд
Что с поддержкой?
• Неявность Ruby • Дорогая процедура добавления гейтов
• Высокий порог вхождения
Что делать?
Вариант #1 Оставить как есть
0
175
350
525
700
Июль Август Сентябрь Октябрь Ноябрь Декабрь
Вариант #2 Глобальный рефакторинг
Вариант #3 Сменить часть система на Sinatra
• Система остается сильно связанной • Много неявного
Наш рецепт• Больше явности • Легкий движок • DSL для конфигурирования • RESTful-компоненты • SoA-архитектура
SoA: сервисы вместо классов
params validator countries_extender
OzonGate
EviterraGate
OneTwoTripGate
merge
throttler
Поддерживаем DSL{"rt_search": { "s": [ "params_validator" "countries_extender", { "p": [ {"s": ["ozon_gate"]}, {"s": ["eviterra_gate"]}, {"s": ["onetwotrip_throttler","onetwotrip_gate"]}] }, "merge" ]}};
Юнит - основа системы
OneTwoTripGatethrottler
def throttler(request, config): if random() <= config: return request else: return None
Как работает юнит?
places_extenderset_confconfig get_conf
raw request
extended request
DSL последовательных вычисленийA B C
"s": [ «A», «B», «C» ]
DSL параллельных вычислений
A
D
"s": [ «A», {«p»: [ {«s»: «B»}, {«s»: «C»} ]}, «D» ]
B
C
DSL отложенных вычислений
A
"s": [ «A», {«d»: [«B»]}, «C» ]
B С
delayed
Прикладной пример
sqrt(add(a,b))
add sqrt[19, 6] 5
Прикладной пример #2
(…)
add[2, 3, -15] ?
(345 - 99 * a) + (77 + 234 * b) + c
add 5
(…)
Данные в системе• Справочники • курсы валют • аэропорты
• Логи • поиски • клики
• Динамические данные • диплинки • результаты поиска
Справочники• ФС или kyotocabinet,
mmap для экономии памяти
• Синхронизация данных - inotify
• Синхронизация внутри кластера - rsync
Логи• Не работаем с глобальным хранилищем
• Работаем с хранилищем в пределах узла
Динамические данные• Быстрое key-value хранилище • Избыточность во имя отказоустойчивости
Технологии?• Python3 • Tornado 3.1.1 • Файловая БД kyotocabinet • Redis
Как устроен кластер
Redis
MySQL
RabbitMQ
Redis
Сценарий отказа #1
Redis
Redis
Сценарий отказа #2
Redis
MySQL
RabbitMQ
Redis
Сценарий отказа #3
MySQL
RabbitMQ
Redis
Сценарий отказа #4
MySQL
RabbitMQ
Redis
Yasen infrastructure
MyS
Rab
Redi
Итого• С системой может работать не программист
• Отладка упростилась в разы • Система разворачивается двумя командами
• Экономия на ресурсах
About
Антон Плешивцев !twitter.com/allaud github.com/allaud https://www.facebook.com/ant.pl.3 !aviasales.ru