Happydev presentation soa

Post on 28-Nov-2014

399 views 1 download

description

Story about avs soa application

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