Анатомия веб-сервиса, Андрей Смирнов (ex-skype)
DESCRIPTION
Доклад Андрея Смирнова на HighLoad++ 2014.TRANSCRIPT
![Page 1: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/1.jpg)
Анатомиявеб-сервиса 2.0
Андрей Смирнов
![Page 2: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/2.jpg)
Backend
![Page 3: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/3.jpg)
Чем занят 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
![Page 4: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/4.jpg)
Роль HTTP reverse proxy• Буферизация запроса
• Буферизация ответа
• “Борьба” с медленными клиентами
• “Снятие” HTTPS
• Отдача статики
![Page 5: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/5.jpg)
Чем занят backend?
1. Склеивание строк
2. Сетевой ввод-вывод
![Page 6: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/6.jpg)
Оптимизация backendа
• Увеличение производительности
• Уменьшение времени отклика
![Page 7: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/7.jpg)
Параллелизм запросов
![Page 8: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/8.jpg)
Параллелизм одного запроса
T
![Page 9: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/9.jpg)
Сетевой ввод-вывод• Блокирующийся
• Неблокирующийся
• Асинхронный
![Page 10: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/10.jpg)
UNIX (POSIX)• fd - файловый дескриптор
• fd = socket()
• listen(fd)/accept(fd)
• read(fd, buf)
• write(fd, buf)
• close(fd)
![Page 11: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/11.jpg)
Блокирующийся ввод-вывод• accept(fd) - заблокируется, пока не будет нового входящего соединения
• read(fd, buf) - заблокируется, пока не прибудут данные в сокет
• write(fd, buf) - заблокируется, пока не освободится место в буфере TCP
![Page 12: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/12.jpg)
Неблокирующийся ввод-вывод• Любая операция завершается немедленно
• Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK
![Page 13: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/13.jpg)
Опрос готовности• Нотификации:
• level-triggered (состояние)
• edge-triggered (изменение состояния)
• Механизмы:
• select(), poll()
• epoll(), kqueue()
![Page 14: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/14.jpg)
Неблокирующий ввод-вывод• select(fds, timeout) ⇛ ready to read/write
• do read/write until EAGAIN
![Page 15: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/15.jpg)
Многозадачность• Обслуживание нескольких клиентов одновременно
• Цель: минимизировать время отклика при условии максимальной нагрузки
↺
![Page 16: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/16.jpg)
Процессы• Полная* изоляция
• Видимость для планировщика ОС
• Сложность коммуникации
• Использование всех процессоров
![Page 17: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/17.jpg)
Процессыcode
r/o
data
heap
code
r/o
data
heap
fork()
listen() accept()SHM
![Page 18: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/18.jpg)
Примеры• Apache: mod_prefork
• FastCGI
• Phusion Passenger
• PostgreSQL
• …
![Page 19: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/19.jpg)
Нити (ОС)• Видны планировщику
• Имеют отдельный стек и TLS
• Более легковесные, чем процесс
• Отсутствует изоляция
• Сложность написания корректных программ
![Page 20: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/20.jpg)
Синхронизация• Любой доступ к общим данным должен быть синхронизирован
• Атомарные операции (без синхронизации)
• GIL
![Page 21: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/21.jpg)
Примеры• MySQL
• Varnish
• …
![Page 22: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/22.jpg)
Кооперативная многозадачность• “Невидима” для ОС, один процесс (нить)
• “Поток” добровольно передает управление другому (проще синхронизация)
• Явная: callbackи
• Неявная: green threads ↺
![Page 23: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/23.jpg)
Реактор• “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы”
• Таймер: “Вызови меня через X мс”
![Page 24: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/24.jpg)
Что внутри• Отсортированный по времени срабатывания список таймеров + callback
• Список файловых дескрипторов для ожидания готовности + callback
• select(fds, min(timer)) ⇛ callbacks
![Page 25: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/25.jpg)
node.jsvar net = require('net'); var client = net.connect({port: 8124}, function() { //'connect' listener console.log('client connected'); client.write('world!\r\n'); }); client.on('data', function(data) { console.log(data.toString()); client.end(); }); client.on('end', function() { console.log('client disconnected'); });
![Page 26: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/26.jpg)
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)
![Page 27: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/27.jpg)
Примеры• Redis
• memcached*
• …
![Page 28: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/28.jpg)
Комбинированные варианты• M нитей : N кооперативных потоков
• nginx
• memcached
• …
![Page 29: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/29.jpg)
Драйвер “БД”• База данных
• Очередь
• K-V хранилище
• Другой сервис
• …
![Page 30: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/30.jpg)
![Page 31: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/31.jpg)
Соединение• Соединение:
• на один запрос
• постоянное
TCP Connect Auth Send query Wait Result Disconnect
Send query Wait Result Send query Wait Result
![Page 32: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/32.jpg)
Pipelining• Pipelining запросов
Send query Wait Result Send query Wait Result
Send query Result Send query Result
![Page 33: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/33.jpg)
Proxy
•mcrouter
•twemproxy
•PgBouncer
•…
![Page 34: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/34.jpg)
А что если backend сложнее?• Сервис-ориентированная архитектура
• Очереди, шины, асинхронная обработка задач
• Кеши, конфигурация, …
• …
![Page 35: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/35.jpg)
Реальный мир• А что же происходит в моем любимом языке программирования X?
h,p://www.123freevectors.com/soldier-skull-with-helmet-vector-art/
![Page 36: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/36.jpg)
JavaScript• Однопоточный
• Явная кооперативная многозадачность
• AJAX, Timer, CSS3 Animation, …
• jQuery.Deferred()
![Page 37: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/37.jpg)
PHP• Нет потоков*
• “Начинаем сначала” на каждый запрос
• Потребность в “accelerator”ах
• Персистентные соединения с БД
![Page 38: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/38.jpg)
Ruby on Rails• Огромное влияние
• Редкие многопоточные применения
• MRI (1.8), YARV (1.9+), JRuby
• Event Machine
• Rack: middleware
![Page 39: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/39.jpg)
Python• WSGI: middleware
• Блокирующий ввод-вывод (Django, …)
• Явная кооперативная многозадачность (Twisted, Tornado)
• Корутины (gevent, eventlet, …)
![Page 40: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/40.jpg)
Java• Потоки ОС
• Неблокирующий ввод-вывод: NIO, NIO2
• Ne,y, Undertow, …
• Thread Pool
![Page 42: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/42.jpg)
Go• Горутины (goroutines)
• Комбинированный вариант (M:N)
• Неблокирующий ввод-вывод
• Каналы
![Page 43: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/43.jpg)
Erlang• Actor model
• Process - комбинированная модель
• Полная изоляция (обмен данными через коммуникацию)
• Распределенные процессы
![Page 44: Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)](https://reader030.vdocuments.pub/reader030/viewer/2022012405/557fcf65d8b42ad1048b4cdc/html5/thumbnails/44.jpg)
Спасибо! Вопросы?• Андрей Смирнов
• @smira
• h,p://smira.ru/