Анатомия веб-сервиса, Андрей Смирнов
Transcript of Анатомия веб-сервиса, Андрей Смирнов
![Page 1: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/1.jpg)
Анатомия веб-‐сервиса
Андрей Смирнов
![Page 2: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/2.jpg)
О чем мы будем говорить?• Введение
• Сетевой ввод-‐вывод
• Многозадачность
• Драйвер БД
• Взаимодействие
• Фреймворки
![Page 3: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/3.jpg)
Backend
![Page 4: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/4.jpg)
Чем занят backend?• Склеивание строк
• Сетевой ввод-‐вывод
L1 cache reference 0.5 ns Main memory reference100 ns Read 1 MB sequenRally from network 10,000,000 ns Read 1 MB sequenRally from disk30,000,000 ns
![Page 5: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/5.jpg)
Что делает backend1. Принять соединение (обычно от proxy) и
распарсить HTTP-‐запрос
2. Аутенфикация
3. Авторизация
4. Сессия
![Page 6: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/6.jpg)
Что делает backend5. Распарсить URL, routing
6. Определение формата вывода, rate limiting, …
7. Бизнес-‐логика, выполнение запроса, кеширование
8. Формирование ответа, шаблоны
![Page 7: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/7.jpg)
Сетевой ввод-‐вывод• Блокирующийся
• Неблокирующийся
• Асинхронный
![Page 8: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/8.jpg)
UNIX (POSIX)• fd -‐ файловый дескриптор
• fd = socket()
• listen(fd)/accept(fd)
• read(fd, buf)
• write(fd, buf)
• close(fd)
![Page 9: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/9.jpg)
Блокирующийся ввод-‐вывод• accept(fd) -‐ заблокируется, пока не будет нового входящего соединения
• read(fd, buf) -‐ заблокируется, пока не прибудут данные в сокет
• write(fd, buf) -‐ заблокируется, пока не освободится место в буфере TCP
![Page 10: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/10.jpg)
Неблокирующийся ввод-‐вывод• Любая операция завершается немедленно
• Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK
![Page 11: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/11.jpg)
Опрос готовности• Нотификации:
• level-‐triggered (состояние)
• edge-‐triggered (изменение состояния)
• Механизмы:
• select(), poll()
• epoll(), kqueue()
![Page 12: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/12.jpg)
Неблокирующийввод-‐вывод• select(fds, Rmeout) ⇛ ready to read/write
• do read/write unRl EAGAIN
![Page 13: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/13.jpg)
Многозадачность• Обслуживание нескольких клиентов одновременно
• Цель: минимизировать время отклика при условии максимальной нагрузки
![Page 14: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/14.jpg)
Процессы• Полная* изоляция
• Видимость для планировщика ОС
• Сложность коммуникации
• Использование всех процессоров
![Page 15: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/15.jpg)
Процессы
code
r/o
data
heap
code
r/o
data
heap
fork()
listen() accept()SHM
![Page 16: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/16.jpg)
Нити (ОС)• Видны планировщику
• Имеют отдельный стек и TLS
• Более легковесные, чем процесс
• Отсутствует изоляция
• Сложность написания корректных программ
![Page 17: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/17.jpg)
Синхронизация• Любой доступ к общим данным должен быть синхронизирован
• Атомарные операции (без синхронизации)
• GIL
![Page 18: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/18.jpg)
Deadlock
![Page 19: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/19.jpg)
Worker
![Page 20: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/20.jpg)
Event Loop
![Page 21: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/21.jpg)
Кооперативная многозадачность• “Невидима” для ОС, один процесс (нить)
• “Поток” добровольно передает управление другому (проще синхронизация)
• Явная: callbackи
• Неявная: green threads
![Page 22: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/22.jpg)
Реактор• “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы”
• Таймер: “Вызови меня через X мс”
![Page 23: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/23.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 24: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/24.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 25: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/25.jpg)
Комбинированные варианты• 1:1
• N:1
• M:N
![Page 26: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/26.jpg)
Драйвер “БД”• База данных
• Очередь
• K-‐V хранилище
• Другой сервис
• …
![Page 27: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/27.jpg)
![Page 28: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/28.jpg)
Соединение• Соединение:
• на один запрос • постоянное
TCP!connect Auth Send query Wait Result
Send query Wait Result Send query Wait Result
Disconnect
![Page 29: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/29.jpg)
Pipelining• Pipelining запросов
Send query Wait Result Send query Wait Result
Send query Send query Result Result
![Page 30: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/30.jpg)
Соединения• Кол-‐во соединений:
• одно
• connecRon pool
• по количеству запросов
![Page 31: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/31.jpg)
Proxy
![Page 32: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/32.jpg)
Взаимодействие• Очереди
• вычислительно сложные задачи
• асинхронные действия
• Архитектурное деление на компоненты
• Обращения к другим сервисам
![Page 33: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/33.jpg)
Очередь задач
![Page 34: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/34.jpg)
Очереди• Publish-‐Subcribe vs. Producer-‐Consumer
• Redis, beanstalkd
• pgq
• RabbitMQ
• Apache Ka�a
![Page 35: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/35.jpg)
RPC• Синхронное взаимодействие: запрос-‐ответ
![Page 36: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/36.jpg)
Широковещательная шина
![Page 37: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/37.jpg)
ØMQ• Коммуникационная библиотека
• Без брокера
• Абстракция установления соединения, реконнектов, транспорта и т.п.
• Паттерны обмена сообщениями
![Page 38: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/38.jpg)
Service-‐Oriented Architecture
![Page 39: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/39.jpg)
SOA• Четко выделенные сервисы со своим интерфейсом
• Сервисы независимы
• Сложность эксплуатации
• Независимое масштабирование
![Page 40: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/40.jpg)
Реальный мир• А что же происходит в моем любимом языке программирования X?
![Page 41: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/41.jpg)
JavaScript• Однопоточный
• Явная кооперативная многозадачность
• AJAX, Timer, CSS3 AnimaRon, …
• jQuery.Deferred()
![Page 42: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/42.jpg)
PHP• Нет потоков*
• “Начинаем сначала” на каждый запрос
• Потребность в “accelerator”ах
• Персистентные соединения с БД
![Page 43: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/43.jpg)
FastCGI
![Page 44: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/44.jpg)
Ruby on Rails• Огромное влияние
• Редкие многопоточные применения
• MRI (1.8), YARV (1.9+), JRuby
• Event Machine
• Rack: middleware
![Page 45: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/45.jpg)
Python• WSGI: middleware
• Блокирующий ввод-‐вывод (Django, …)
• Явная кооперативная многозадачность (Twisted, Tornado)
• Корутины (gevent, eventlet, …)
![Page 46: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/46.jpg)
Java• Потоки ОС
• Неблокирующий ввод-‐вывод: NIO, NIO2
• Ne�y
• Thread Pool
![Page 47: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/47.jpg)
Go• Горутины (gorouRnes)
• Комбинированный вариант (M:N)
• Неблокирующий ввод-‐вывод
• Каналы
![Page 48: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/48.jpg)
Erlang• Actor model
• Process -‐ комбинированная модель
• Полная изоляция (обмен данными через коммуникацию)
• Распределенные процессы
![Page 49: Анатомия веб-сервиса, Андрей Смирнов](https://reader034.fdocument.pub/reader034/viewer/2022042715/5594ad0a1a28ab920e8b46f9/html5/thumbnails/49.jpg)
© Copyright 2014 Andrey Smirnov
Разработка надежных высоконагруженных систем
• 24, 25 и 26-‐го мая, Москва
• h�p://smira.highload.ru/
• Мастер-‐класс с практическими заданиями