SlideShare a Scribd company logo
Анатомия 
веб-сервиса 2.0 
Андрей Смирнов
Backend
Чем занят backend? 
T 
- CPU - I/O 
Compress 
1K 
bytes 
with 
Zippy 
3,000 
ns 
Round 
trip 
within 
same 
datacenter 
500,000 
ns 
h,ps://gist.github.com/jboner/2841832
Роль HTTP reverse proxy 
• Буферизация запроса 
• Буферизация ответа 
• “Борьба” с медленными клиентами 
• “Снятие” HTTPS 
• Отдача статики
Чем занят backend? 
1. Склеивание строк 
2. Сетевой ввод-вывод
Оптимизация backendа 
• Увеличение производительности 
• Уменьшение времени отклика
Параллелизм запросов
Параллелизм одного запроса 
T
Сетевой ввод-вывод 
• Блокирующийся 
• Неблокирующийся 
• Асинхронный
UNIX (POSIX) 
• fd - файловый дескриптор 
• fd = socket() 
• listen(fd)/accept(fd) 
• read(fd, buf) 
• write(fd, buf) 
• close(fd)
Блокирующийся ввод-вывод 
• accept(fd) - заблокируется, пока не будет нового 
входящего соединения 
• read(fd, buf) - заблокируется, пока не прибудут 
данные в сокет 
• write(fd, buf) - заблокируется, пока не освободится 
место в буфере TCP
Неблокирующийся ввод-вывод 
• Любая операция завершается немедленно 
• Вместо того, чтобы заблокироваться, вызов 
возвращает EAGAIN/EWOULDBLOCK
Опрос готовности 
• Нотификации: 
• level-triggered (состояние) 
• edge-triggered (изменение состояния) 
• Механизмы: 
• select(), poll() 
• epoll(), kqueue()
Неблокирующий ввод-вывод 
• select(fds, timeout) ⇛ ready to read/write 
• do read/write until EAGAIN
Многозадачность 
• Обслуживание нескольких клиентов одновременно 
• Цель: минимизировать время отклика при условии 
максимальной нагрузки 
↺
Процессы 
• Полная* изоляция 
• Видимость для планировщика ОС 
• Сложность коммуникации 
• Использование всех процессоров
Процессы 
code 
r/o 
data 
heap 
code 
r/o 
data 
heap 
fork() 
listen() accept() 
SHM
Примеры 
• Apache: mod_prefork 
• FastCGI 
• Phusion Passenger 
• PostgreSQL 
• …
Нити (ОС) 
• Видны планировщику 
• Имеют отдельный стек и TLS 
• Более легковесные, чем процесс 
• Отсутствует изоляция 
• Сложность написания корректных программ
Синхронизация 
• Любой доступ к общим данным должен быть 
синхронизирован 
• Атомарные операции (без синхронизации) 
• GIL
Примеры 
• MySQL 
• Varnish 
• …
Кооперативная многозадачность 
• “Невидима” для ОС, один процесс (нить) 
• “Поток” добровольно передает управление другому 
(проще синхронизация) 
• Явная: callbackи 
• Неявная: green threads ↺
Реактор 
• “Дай мне кучу сокетов, а я сделаю callback, когда они 
будут готовы” 
• Таймер: “Вызови меня через X мс”
Что внутри 
• Отсортированный по времени срабатывания список 
таймеров + callback 
• Список файловых дескрипторов для ожидания 
готовности + callback 
• select(fds, min(timer)) ⇛ callbacks
node.js 
var 
net 
= 
require('net'); 
var 
client 
= 
net.connect({port: 
8124}, 
function() 
{ 
//'connect' 
listener 
console.log('client 
connected'); 
client.write('world!rn'); 
}); 
client.on('data', 
function(data) 
{ 
console.log(data.toString()); 
client.end(); 
}); 
client.on('end', 
function() 
{ 
console.log('client 
disconnected'); 
});
gevent 
def 
print_head(url): 
print('Starting 
%s' 
% 
url) 
data 
= 
urlopen(url).read() 
print('%s: 
%s 
bytes: 
%r' 
% 
(url, 
len(data), 
data[:50])) 
jobs 
= 
[gevent.spawn(print_head, 
url) 
for 
url 
in 
urls] 
gevent.wait(jobs)
Примеры 
• Redis 
• memcached* 
• …
Комбинированные варианты 
• M нитей : N кооперативных потоков 
• nginx 
• memcached 
• …
Драйвер “БД” 
• База данных 
• Очередь 
• K-V хранилище 
• Другой сервис 
• …
Соединение 
• Соединение: 
• на один запрос 
TCP Connect Auth Send query Wait Result Disconnect 
• постоянное 
Send query Wait Result Send query Wait Result
Pipelining 
• Pipelining запросов 
Send query Wait Result Send query Wait Result 
Send query Result Send query Result
Proxy 
•mcrouter 
•twemproxy 
•PgBouncer 
•…
А что если backend сложнее? 
• Сервис-ориентированная архитектура 
• Очереди, шины, асинхронная обработка задач 
• Кеши, конфигурация, … 
• …
Реальный мир 
• А что же происходит в моем любимом языке 
программирования X? 
h,p://www.123freevectors.com/soldier-skull-with-helmet-vector-art/
JavaScript 
• Однопоточный 
• Явная кооперативная многозадачность 
• AJAX, Timer, CSS3 Animation, … 
• jQuery.Deferred()
PHP 
• Нет потоков* 
• “Начинаем сначала” на каждый запрос 
• Потребность в “accelerator”ах 
• Персистентные соединения с БД
Ruby on Rails 
• Огромное влияние 
• Редкие многопоточные применения 
• MRI (1.8), YARV (1.9+), JRuby 
• Event Machine 
• Rack: middleware
Python 
• WSGI: middleware 
• Блокирующий ввод-вывод (Django, …) 
• Явная кооперативная многозадачность (Twisted, 
Tornado) 
• Корутины (gevent, eventlet, …)
Java 
• Потоки ОС 
• Неблокирующий ввод-вывод: NIO, NIO2 
• Ne,y, Undertow, … 
• Thread Pool
.NET 
• Потоки ОС 
• async/await 
• ASP.NET, ServiceStack, Nancy, … 
• Mono
Go 
• Горутины (goroutines) 
• Комбинированный вариант (M:N) 
• Неблокирующий ввод-вывод 
• Каналы
Erlang 
• Actor model 
• Process - комбинированная модель 
• Полная изоляция (обмен данными через 
коммуникацию) 
• Распределенные процессы
Спасибо! Вопросы? 
• Андрей Смирнов 
• @smira 
• me@smira.ru 
• h,p://smira.ru/

More Related Content

What's hot

Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примере
Sergey Xek
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Ontico
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Ontico
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Fwdays
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
Andrew Minkin
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
Badoo Development
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ontico
 
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Ontico
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
Badoo Development
 
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
AvitoTech
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
Badoo Development
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Ontico
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Ontico
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Ontico
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
Ontico
 

What's hot (19)

Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примере
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
 
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
Yevgen Lysenko "AWS RDS Aurora Serverless, ECS Fargate and more serverless-pr...
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
 
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 

Similar to Анатомия веб сервиса (HighLoad-2014)

Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновOntico
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
Andrei Pangin
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Ontico
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Ontico
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Badoo Development
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Yulia Kotova
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Yulia Kotova
 
Перенос данных пользователей Badoo между датацентрами
Перенос данных пользователей Badoo между датацентрамиПеренос данных пользователей Badoo между датацентрами
Перенос данных пользователей Badoo между датацентрами
Alexandr Krasheninnikov
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Ontico
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)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
 
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Ontico
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
SQALab
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуYandex
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 

Similar to Анатомия веб сервиса (HighLoad-2014) (20)

Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей Смирнов
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
 
Перенос данных пользователей Badoo между датацентрами
Перенос данных пользователей Badoo между датацентрамиПеренос данных пользователей Badoo между датацентрами
Перенос данных пользователей Badoo между датацентрами
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 
Sivko
SivkoSivko
Sivko
 
«Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум» «Сетевые протоколы для веб разработчика — выжимаем максимум»
«Сетевые протоколы для веб разработчика — выжимаем максимум»
 
Разгоняем 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.)
 
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Async Python
Async PythonAsync Python
Async Python
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизу
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 

More from Andrey Smirnov

Remote Highload
Remote HighloadRemote Highload
Remote Highload
Andrey Smirnov
 
Вебинар "Разработка высоконагруженных и надежных систем": Введение
Вебинар "Разработка высоконагруженных и надежных систем": ВведениеВебинар "Разработка высоконагруженных и надежных систем": Введение
Вебинар "Разработка высоконагруженных и надежных систем": Введение
Andrey Smirnov
 
Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)
Andrey Smirnov
 
Курс высокие нагрузки: очереди (отрывок)
Курс высокие нагрузки:  очереди (отрывок)Курс высокие нагрузки:  очереди (отрывок)
Курс высокие нагрузки: очереди (отрывок)
Andrey Smirnov
 
aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)Andrey Smirnov
 
Курс высокие нагрузки и надежность: отрывок
Курс высокие нагрузки и надежность: отрывокКурс высокие нагрузки и надежность: отрывок
Курс высокие нагрузки и надежность: отрывок
Andrey Smirnov
 
aptly: Debian repository management tool
aptly: Debian repository management toolaptly: Debian repository management tool
aptly: Debian repository management tool
Andrey Smirnov
 
aptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетовaptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетов
Andrey Smirnov
 
Smirnov twisted-python
Smirnov twisted-pythonSmirnov twisted-python
Smirnov twisted-pythonAndrey Smirnov
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)
Andrey Smirnov
 

More from Andrey Smirnov (14)

Remote Highload
Remote HighloadRemote Highload
Remote Highload
 
Вебинар "Разработка высоконагруженных и надежных систем": Введение
Вебинар "Разработка высоконагруженных и надежных систем": ВведениеВебинар "Разработка высоконагруженных и надежных систем": Введение
Вебинар "Разработка высоконагруженных и надежных систем": Введение
 
Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)
 
Курс высокие нагрузки: очереди (отрывок)
Курс высокие нагрузки:  очереди (отрывок)Курс высокие нагрузки:  очереди (отрывок)
Курс высокие нагрузки: очереди (отрывок)
 
aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)
 
Курс высокие нагрузки и надежность: отрывок
Курс высокие нагрузки и надежность: отрывокКурс высокие нагрузки и надежность: отрывок
Курс высокие нагрузки и надежность: отрывок
 
aptly: Debian repository management tool
aptly: Debian repository management toolaptly: Debian repository management tool
aptly: Debian repository management tool
 
aptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетовaptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетов
 
Smirnov twisted-python
Smirnov twisted-pythonSmirnov twisted-python
Smirnov twisted-python
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)
 
pyFMS
pyFMSpyFMS
pyFMS
 
pyFMS
pyFMSpyFMS
pyFMS
 
PGDBObject
PGDBObjectPGDBObject
PGDBObject
 

Анатомия веб сервиса (HighLoad-2014)

  • 1. Анатомия веб-сервиса 2.0 Андрей Смирнов
  • 3. Чем занят backend? T - CPU - I/O Compress 1K bytes with Zippy 3,000 ns Round trip within same datacenter 500,000 ns h,ps://gist.github.com/jboner/2841832
  • 4. Роль HTTP reverse proxy • Буферизация запроса • Буферизация ответа • “Борьба” с медленными клиентами • “Снятие” HTTPS • Отдача статики
  • 5. Чем занят backend? 1. Склеивание строк 2. Сетевой ввод-вывод
  • 6. Оптимизация backendа • Увеличение производительности • Уменьшение времени отклика
  • 9. Сетевой ввод-вывод • Блокирующийся • Неблокирующийся • Асинхронный
  • 10. UNIX (POSIX) • fd - файловый дескриптор • fd = socket() • listen(fd)/accept(fd) • read(fd, buf) • write(fd, buf) • close(fd)
  • 11. Блокирующийся ввод-вывод • accept(fd) - заблокируется, пока не будет нового входящего соединения • read(fd, buf) - заблокируется, пока не прибудут данные в сокет • write(fd, buf) - заблокируется, пока не освободится место в буфере TCP
  • 12. Неблокирующийся ввод-вывод • Любая операция завершается немедленно • Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK
  • 13. Опрос готовности • Нотификации: • level-triggered (состояние) • edge-triggered (изменение состояния) • Механизмы: • select(), poll() • epoll(), kqueue()
  • 14. Неблокирующий ввод-вывод • select(fds, timeout) ⇛ ready to read/write • do read/write until EAGAIN
  • 15. Многозадачность • Обслуживание нескольких клиентов одновременно • Цель: минимизировать время отклика при условии максимальной нагрузки ↺
  • 16. Процессы • Полная* изоляция • Видимость для планировщика ОС • Сложность коммуникации • Использование всех процессоров
  • 17. Процессы code r/o data heap code r/o data heap fork() listen() accept() SHM
  • 18. Примеры • Apache: mod_prefork • FastCGI • Phusion Passenger • PostgreSQL • …
  • 19. Нити (ОС) • Видны планировщику • Имеют отдельный стек и TLS • Более легковесные, чем процесс • Отсутствует изоляция • Сложность написания корректных программ
  • 20. Синхронизация • Любой доступ к общим данным должен быть синхронизирован • Атомарные операции (без синхронизации) • GIL
  • 21. Примеры • MySQL • Varnish • …
  • 22. Кооперативная многозадачность • “Невидима” для ОС, один процесс (нить) • “Поток” добровольно передает управление другому (проще синхронизация) • Явная: callbackи • Неявная: green threads ↺
  • 23. Реактор • “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы” • Таймер: “Вызови меня через X мс”
  • 24. Что внутри • Отсортированный по времени срабатывания список таймеров + callback • Список файловых дескрипторов для ожидания готовности + callback • select(fds, min(timer)) ⇛ callbacks
  • 25. node.js var net = require('net'); var client = net.connect({port: 8124}, function() { //'connect' listener console.log('client connected'); client.write('world!rn'); }); client.on('data', function(data) { console.log(data.toString()); client.end(); }); client.on('end', function() { console.log('client disconnected'); });
  • 26. gevent def print_head(url): print('Starting %s' % url) data = urlopen(url).read() print('%s: %s bytes: %r' % (url, len(data), data[:50])) jobs = [gevent.spawn(print_head, url) for url in urls] gevent.wait(jobs)
  • 27. Примеры • Redis • memcached* • …
  • 28. Комбинированные варианты • M нитей : N кооперативных потоков • nginx • memcached • …
  • 29. Драйвер “БД” • База данных • Очередь • K-V хранилище • Другой сервис • …
  • 30.
  • 31. Соединение • Соединение: • на один запрос TCP Connect Auth Send query Wait Result Disconnect • постоянное Send query Wait Result Send query Wait Result
  • 32. Pipelining • Pipelining запросов Send query Wait Result Send query Wait Result Send query Result Send query Result
  • 33. Proxy •mcrouter •twemproxy •PgBouncer •…
  • 34. А что если backend сложнее? • Сервис-ориентированная архитектура • Очереди, шины, асинхронная обработка задач • Кеши, конфигурация, … • …
  • 35. Реальный мир • А что же происходит в моем любимом языке программирования X? h,p://www.123freevectors.com/soldier-skull-with-helmet-vector-art/
  • 36. JavaScript • Однопоточный • Явная кооперативная многозадачность • AJAX, Timer, CSS3 Animation, … • jQuery.Deferred()
  • 37. PHP • Нет потоков* • “Начинаем сначала” на каждый запрос • Потребность в “accelerator”ах • Персистентные соединения с БД
  • 38. Ruby on Rails • Огромное влияние • Редкие многопоточные применения • MRI (1.8), YARV (1.9+), JRuby • Event Machine • Rack: middleware
  • 39. Python • WSGI: middleware • Блокирующий ввод-вывод (Django, …) • Явная кооперативная многозадачность (Twisted, Tornado) • Корутины (gevent, eventlet, …)
  • 40. Java • Потоки ОС • Неблокирующий ввод-вывод: NIO, NIO2 • Ne,y, Undertow, … • Thread Pool
  • 41. .NET • Потоки ОС • async/await • ASP.NET, ServiceStack, Nancy, … • Mono
  • 42. Go • Горутины (goroutines) • Комбинированный вариант (M:N) • Неблокирующий ввод-вывод • Каналы
  • 43. Erlang • Actor model • Process - комбинированная модель • Полная изоляция (обмен данными через коммуникацию) • Распределенные процессы
  • 44. Спасибо! Вопросы? • Андрей Смирнов • @smira • me@smira.ru • h,p://smira.ru/