Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Переход к SoA архитектуре
Search
HappyDev'13
December 07, 2013
Programming
0
320
Переход к SoA архитектуре
Антон Плешивцев
HappyDev'13
December 07, 2013
Tweet
Share
More Decks by HappyDev'13
See All by HappyDev'13
Вводный доклад о процессах и ролях, требованиях и визуализации
happydev
0
210
Особенности разработки финансовых проектов
happydev
0
170
Domain Driven Design. Модель вместо требований
happydev
0
430
К черту менеджерские карго культы! Дайте нормальное ТЗ
happydev
0
210
Эволюция больших проектов. Опыт API Яндекс.Карт
happydev
1
450
Мастер класс «Управленческие поединки»
happydev
0
210
Лучшая client-side архитектура
happydev
1
280
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
happydev
0
570
Вводный доклад про SQL, NoSQL и других
happydev
0
280
Other Decks in Programming
See All in Programming
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
18
7.5k
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
120
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
500
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
260
dotfiles 式年遷宮 令和最新版
masawada
1
790
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
3
160
認証・認可の基本を学ぼう前編
kouyuume
0
250
SwiftUIで本格音ゲー実装してみた
hypebeans
0
420
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
150
Deno Tunnel を使ってみた話
kamekyame
0
140
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
246
13k
Unsuck your backbone
ammeep
671
58k
Facilitating Awesome Meetings
lara
57
6.7k
Building an army of robots
kneath
306
46k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Music & Morning Musume
bryan
46
7k
For a Future-Friendly Web
brad_frost
180
10k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Transcript
Переход к 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" ]}};
Юнит - основа системы OneTwoTripGate throttler def throttler(request, config): if
random() <= config: return request else: return None
Как работает юнит? places_extender set_conf config 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 Rabbit MQ Redis
Сценарий отказа #1 Redis Redis
Сценарий отказа #2 Redis MySQL Rabbit MQ Redis
Сценарий отказа #3 MySQL Rabbit MQ Redis
Сценарий отказа #4 MySQL Rabbit MQ Redis
Yasen infrastructure MyS Rab Redi
Итого • С системой может работать не программист • Отладка
упростилась в разы • Система разворачивается двумя командами • Экономия на ресурсах
About Антон Плешивцев ! twitter.com/allaud github.com/allaud https://www.facebook.com/ant.pl.3 ! aviasales.ru
None