SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Анатомия 
веб-сервиса 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/

Contenu connexe

Tendances

Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
Badoo Development
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Ontico
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
Ontico
 
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
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
Badoo Development
 

Tendances (20)

Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
 
Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)Курс высокие нагрузки: сеть (отрывок)
Курс высокие нагрузки: сеть (отрывок)
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в Одноклассниках
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
 
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Docker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через годDocker в работе: взгляд на использование в Badoo через год
Docker в работе: взгляд на использование в Badoo через год
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 

Similaire à Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)

Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей Смирнов
Ontico
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
drupalconf
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
Ontico
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Badoo Development
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Yulia Kotova
 
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрамиКак мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Yulia Kotova
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Ontico
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
Ontico
 
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Ontico
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизу
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 programming
Andrei Pangin
 

Similaire à Анатомия веб-сервиса, Андрей Смирнов (ex-Skype) (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 — система управления дата-центром в Одноклассниках / Олег Анастасье...
 

Plus de Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Plus de Ontico (20)

Масштабируя 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)
 
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...
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 

Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)

  • 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/