49
Анатомия вебсервиса Андрей Смирнов

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

  • Upload
    ontico

  • View
    121

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Анатомия веб-сервиса, Андрей Смирнов

Анатомия веб-­‐сервиса

Андрей  Смирнов

Page 2: Анатомия веб-сервиса, Андрей Смирнов

О  чем  мы  будем  говорить?• Введение  

• Сетевой  ввод-­‐вывод  

• Многозадачность  

• Драйвер  БД  

• Взаимодействие  

• Фреймворки

Page 3: Анатомия веб-сервиса, Андрей Смирнов

Backend

Page 4: Анатомия веб-сервиса, Андрей Смирнов

Чем  занят  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: Анатомия веб-сервиса, Андрей Смирнов

Что  делает  backend1. Принять  соединение  (обычно  от  proxy)  и  

распарсить  HTTP-­‐запрос  

2. Аутенфикация  

3. Авторизация  

4. Сессия

Page 6: Анатомия веб-сервиса, Андрей Смирнов

Что  делает  backend5. Распарсить  URL,  routing  

6. Определение  формата  вывода,  rate  limiting,  …  

7. Бизнес-­‐логика,  выполнение  запроса,  кеширование  

8. Формирование  ответа,  шаблоны

Page 7: Анатомия веб-сервиса, Андрей Смирнов

Сетевой  ввод-­‐вывод• Блокирующийся  

• Неблокирующийся  

• Асинхронный

Page 8: Анатомия веб-сервиса, Андрей Смирнов

UNIX  (POSIX)• fd  -­‐  файловый  дескриптор  

• fd  =  socket()  

• listen(fd)/accept(fd)  

• read(fd,  buf)  

• write(fd,  buf)  

• close(fd)

Page 9: Анатомия веб-сервиса, Андрей Смирнов

Блокирующийся   ввод-­‐вывод• accept(fd)  -­‐  заблокируется,  пока  не  будет  нового  входящего  соединения  

• read(fd,  buf)  -­‐  заблокируется,  пока  не  прибудут  данные  в  сокет  

• write(fd,  buf)  -­‐  заблокируется,  пока  не  освободится  место  в  буфере  TCP

Page 10: Анатомия веб-сервиса, Андрей Смирнов

Неблокирующийся   ввод-­‐вывод• Любая  операция  завершается  немедленно  

• Вместо  того,  чтобы  заблокироваться,  вызов  возвращает  EAGAIN/EWOULDBLOCK

Page 11: Анатомия веб-сервиса, Андрей Смирнов

Опрос  готовности• Нотификации:  

• level-­‐triggered  (состояние)  

• edge-­‐triggered  (изменение  состояния)  

•  Механизмы:  

• select(),  poll()  

• epoll(),  kqueue()

Page 12: Анатомия веб-сервиса, Андрей Смирнов

Неблокирующийввод-­‐вывод• select(fds,  Rmeout)  ⇛  ready  to  read/write  

• do  read/write  unRl  EAGAIN

Page 13: Анатомия веб-сервиса, Андрей Смирнов

Многозадачность• Обслуживание  нескольких  клиентов  одновременно  

• Цель:  минимизировать  время  отклика  при  условии  максимальной  нагрузки  

Page 14: Анатомия веб-сервиса, Андрей Смирнов

Процессы• Полная*  изоляция  

• Видимость  для  планировщика  ОС  

• Сложность  коммуникации  

• Использование  всех  процессоров

Page 15: Анатомия веб-сервиса, Андрей Смирнов

Процессы

code

r/o

data

heap

code

r/o

data

heap

fork()

listen() accept()SHM

Page 16: Анатомия веб-сервиса, Андрей Смирнов

Нити  (ОС)• Видны  планировщику  

• Имеют  отдельный  стек  и  TLS  

• Более  легковесные,  чем  процесс  

• Отсутствует  изоляция  

• Сложность  написания  корректных  программ

Page 17: Анатомия веб-сервиса, Андрей Смирнов

Синхронизация• Любой  доступ  к  общим  данным  должен  быть  синхронизирован  

• Атомарные  операции  (без  синхронизации)  

• GIL

Page 18: Анатомия веб-сервиса, Андрей Смирнов

Deadlock

Page 19: Анатомия веб-сервиса, Андрей Смирнов

Worker

Page 20: Анатомия веб-сервиса, Андрей Смирнов

Event  Loop

Page 21: Анатомия веб-сервиса, Андрей Смирнов

Кооперативная  многозадачность• “Невидима”  для  ОС,  один  процесс  (нить)  

• “Поток”  добровольно  передает  управление  другому  (проще  синхронизация)  

• Явная:  callbackи  

• Неявная:  green  threads

Page 22: Анатомия веб-сервиса, Андрей Смирнов

Реактор• “Дай  мне  кучу  сокетов,  а  я  сделаю  callback,  когда  они  будут  готовы”  

• Таймер:  “Вызови  меня  через  X  мс”

Page 23: Анатомия веб-сервиса, Андрей Смирнов

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: Анатомия веб-сервиса, Андрей Смирнов

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: Анатомия веб-сервиса, Андрей Смирнов

Комбинированные  варианты• 1:1  

• N:1  

• M:N

Page 26: Анатомия веб-сервиса, Андрей Смирнов

Драйвер  “БД”• База  данных  

• Очередь  

• K-­‐V  хранилище  

• Другой  сервис  

• …

Page 27: Анатомия веб-сервиса, Андрей Смирнов
Page 28: Анатомия веб-сервиса, Андрей Смирнов

Соединение• Соединение:  

• на  один  запрос  • постоянное

TCP!connect Auth Send query Wait Result

Send query Wait Result Send query Wait Result

Disconnect

Page 29: Анатомия веб-сервиса, Андрей Смирнов

Pipelining• Pipelining  запросов

Send query Wait Result Send query Wait Result

Send query Send query Result Result

Page 30: Анатомия веб-сервиса, Андрей Смирнов

Соединения• Кол-­‐во  соединений:  

• одно  

• connecRon  pool  

• по  количеству  запросов

Page 31: Анатомия веб-сервиса, Андрей Смирнов

Proxy

Page 32: Анатомия веб-сервиса, Андрей Смирнов

Взаимодействие• Очереди  

• вычислительно  сложные  задачи  

• асинхронные  действия  

• Архитектурное  деление  на  компоненты  

• Обращения  к  другим  сервисам

Page 33: Анатомия веб-сервиса, Андрей Смирнов

Очередь  задач

Page 34: Анатомия веб-сервиса, Андрей Смирнов

Очереди• Publish-­‐Subcribe  vs.  Producer-­‐Consumer  

• Redis,  beanstalkd  

• pgq  

• RabbitMQ  

• Apache  Ka�a

Page 35: Анатомия веб-сервиса, Андрей Смирнов

RPC• Синхронное  взаимодействие:  запрос-­‐ответ

Page 36: Анатомия веб-сервиса, Андрей Смирнов

Широковещательная  шина

Page 37: Анатомия веб-сервиса, Андрей Смирнов

ØMQ• Коммуникационная  библиотека  

• Без  брокера  

• Абстракция  установления  соединения,  реконнектов,  транспорта  и  т.п.  

• Паттерны  обмена  сообщениями

Page 38: Анатомия веб-сервиса, Андрей Смирнов

Service-­‐Oriented  Architecture

Page 39: Анатомия веб-сервиса, Андрей Смирнов

SOA• Четко  выделенные  сервисы  со  своим  интерфейсом  

• Сервисы  независимы  

• Сложность  эксплуатации  

• Независимое  масштабирование

Page 40: Анатомия веб-сервиса, Андрей Смирнов

Реальный  мир• А  что  же  происходит  в  моем  любимом  языке  программирования  X?

Page 41: Анатомия веб-сервиса, Андрей Смирнов

JavaScript• Однопоточный  

• Явная  кооперативная  многозадачность  

• AJAX,  Timer,  CSS3  AnimaRon,  …  

• jQuery.Deferred()

Page 42: Анатомия веб-сервиса, Андрей Смирнов

PHP• Нет  потоков*  

• “Начинаем  сначала”  на  каждый  запрос  

• Потребность  в  “accelerator”ах  

• Персистентные  соединения  с  БД

Page 43: Анатомия веб-сервиса, Андрей Смирнов

FastCGI

Page 44: Анатомия веб-сервиса, Андрей Смирнов

Ruby  on  Rails• Огромное  влияние  

• Редкие  многопоточные  применения  

• MRI  (1.8),  YARV  (1.9+),  JRuby  

• Event  Machine  

• Rack:  middleware

Page 45: Анатомия веб-сервиса, Андрей Смирнов

Python• WSGI:  middleware  

• Блокирующий  ввод-­‐вывод  (Django,  …)  

• Явная  кооперативная  многозадачность  (Twisted,  Tornado)  

• Корутины  (gevent,  eventlet,  …)

Page 46: Анатомия веб-сервиса, Андрей Смирнов

Java• Потоки  ОС  

• Неблокирующий  ввод-­‐вывод:  NIO,  NIO2  

• Ne�y  

• Thread  Pool

Page 47: Анатомия веб-сервиса, Андрей Смирнов

Go• Горутины  (gorouRnes)  

• Комбинированный  вариант  (M:N)  

• Неблокирующий  ввод-­‐вывод  

• Каналы

Page 48: Анатомия веб-сервиса, Андрей Смирнов

Erlang• Actor  model  

• Process  -­‐  комбинированная  модель  

• Полная  изоляция  (обмен  данными  через  коммуникацию)  

• Распределенные  процессы

Page 49: Анатомия веб-сервиса, Андрей Смирнов

© Copyright 2014 Andrey Smirnov

Разработка  надежных  высоконагруженных  систем

• 24,  25  и  26-­‐го  мая,  Москва  

• h�p://smira.highload.ru/  

• Мастер-­‐класс  с  практическими  заданиями