Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Анатомия

веб-­‐сервиса
Андрей	
  Смирнов
О	
  чем	
  мы	
  будем	
  говорить?
• Введение	
  
• Сетевой	
  ввод-­‐вывод	
  
• Многозадачность	
  
• Драйвер	
  БД	
 ...
Backend
Чем	
  занят	
  backend?
• Склеивание	
  строк	
  
• Сетевой	
  ввод-­‐вывод
L1	
  cache	
  reference	
  

0.5	
  ns	
  
M...
Что	
  делает	
  backend
1. Принять	
  соединение	
  (обычно	
  от	
  proxy)	
  и	
  
распарсить	
  HTTP-­‐запрос	
  
2. А...
Что	
  делает	
  backend
5. Распарсить	
  URL,	
  routing	
  
6. Определение	
  формата	
  вывода,	
  rate	
  
limiting,	
...
Сетевой	
  ввод-­‐вывод
• Блокирующийся	
  
• Неблокирующийся	
  
• Асинхронный
UNIX	
  (POSIX)
• fd	
  -­‐	
  файловый	
  дескриптор	
  
• fd	
  =	
  socket()	
  
• listen(fd)/accept(fd)	
  
• read(fd,...
Блокирующийся	
  

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

ввод-­‐вывод
• Любая	
  операция	
  завершается	
  немедленно	
  
• Вместо	
  того,	
  чтобы	
  забло...
Опрос	
  готовности
• Нотификации:	
  
• level-­‐triggered	
  (состояние)	
  
• edge-­‐triggered	
  (изменение	
  состояни...
Неблокирующий

ввод-­‐вывод
• select(fds,	
  Rmeout)	
  ⇛	
  ready	
  to	
  read/write	
  
• do	
  read/write	
  unRl	
  E...
Многозадачность
• Обслуживание	
  нескольких	
  клиентов	
  
одновременно	
  
• Цель:	
  минимизировать	
  время	
  отклик...
Процессы
• Полная*	
  изоляция	
  
• Видимость	
  для	
  планировщика	
  ОС	
  
• Сложность	
  коммуникации	
  
• Использо...
Процессы
code
r/o
data
heap
code
r/o
data
heap
fork()
listen() accept()
SHM
Нити	
  (ОС)
• Видны	
  планировщику	
  
• Имеют	
  отдельный	
  стек	
  и	
  TLS	
  
• Более	
  легковесные,	
  чем	
  пр...
Синхронизация
• Любой	
  доступ	
  к	
  общим	
  данным	
  должен	
  
быть	
  синхронизирован	
  
• Атомарные	
  операции	...
Deadlock
Worker
Event	
  Loop
Кооперативная	
  
многозадачность
• “Невидима”	
  для	
  ОС,	
  один	
  процесс	
  (нить)	
  
• “Поток”	
  добровольно	
  ...
Реактор
• “Дай	
  мне	
  кучу	
  сокетов,	
  а	
  я	
  сделаю	
  callback,	
  
когда	
  они	
  будут	
  готовы”	
  
• Тайм...
node.js
var net = require('net');
var client = net.connect({port: 8124},
function() { //'connect' listener
console.log('cl...
gevent
def print_head(url):!
print('Starting %s' % url)!
data = urlopen(url).read()!
print('%s: %s bytes: %r' % (url, len(...
Комбинированные	
  варианты
• 1:1	
  
• N:1	
  
• M:N
Драйвер	
  “БД”
• База	
  данных	
  
• Очередь	
  
• K-­‐V	
  хранилище	
  
• Другой	
  сервис	
  
• …
Соединение
• Соединение:	
  
• на	
  один	
  запрос	
  
• постоянное
TCP!
connect
Auth Send query Wait Result
Send query W...
Pipelining
• Pipelining	
  запросов
Send query Wait Result Send query Wait Result
Send query Send query Result Result
Соединения
• Кол-­‐во	
  соединений:	
  
• одно	
  
• connecRon	
  pool	
  
• по	
  количеству	
  запросов
Proxy
Взаимодействие
• Очереди	
  
• вычислительно	
  сложные	
  задачи	
  
• асинхронные	
  действия	
  
• Архитектурное	
  дел...
Очередь	
  задач
Очереди
• Publish-­‐Subcribe	
  vs.	
  Producer-­‐Consumer	
  
• Redis,	
  beanstalkd	
  
• pgq	
  
• RabbitMQ	
  
• Apach...
RPC
• Синхронное	
  взаимодействие:	
  запрос-­‐ответ
Широковещательная	
  шина
ØMQ
• Коммуникационная	
  библиотека	
  
• Без	
  брокера	
  
• Абстракция	
  установления	
  соединения,	
  
реконнектов,...
Service-­‐Oriented	
  Architecture
SOA
• Четко	
  выделенные	
  сервисы	
  со	
  своим	
  
интерфейсом	
  
• Сервисы	
  независимы	
  
• Сложность	
  эксплуа...
Реальный	
  мир
• А	
  что	
  же	
  происходит	
  в	
  моем	
  любимом	
  
языке	
  программирования	
  X?
JavaScript
• Однопоточный	
  
• Явная	
  кооперативная	
  многозадачность	
  
• AJAX,	
  Timer,	
  CSS3	
  AnimaRon,	
  …	...
PHP
• Нет	
  потоков*	
  
• “Начинаем	
  сначала”	
  на	
  каждый	
  запрос	
  
• Потребность	
  в	
  “accelerator”ах	
  
...
FastCGI
Ruby	
  on	
  Rails
• Огромное	
  влияние	
  
• Редкие	
  многопоточные	
  применения	
  
• MRI	
  (1.8),	
  YARV	
  (1.9+...
Python
• WSGI:	
  middleware	
  
• Блокирующий	
  ввод-­‐вывод	
  (Django,	
  …)	
  
• Явная	
  кооперативная	
  многозада...
Java
• Потоки	
  ОС	
  
• Неблокирующий	
  ввод-­‐вывод:	
  NIO,	
  NIO2	
  
• Nežy	
  
• Thread	
  Pool
Go
• Горутины	
  (gorouRnes)	
  
• Комбинированный	
  вариант	
  (M:N)	
  
• Неблокирующий	
  ввод-­‐вывод	
  
• Каналы
Erlang
• Actor	
  model	
  
• Process	
  -­‐	
  комбинированная	
  модель	
  
• Полная	
  изоляция	
  (обмен	
  данными	
 ...
© Copyright 2014 Andrey Smirnov
Разработка	
  надежных	
  
высоконагруженных	
  систем
• 24,	
  25	
  и	
  26-­‐го	
  мая,...
Анатомия веб-сервиса, Андрей Смирнов
Upcoming SlideShare
Loading in …5
×

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

436 views

Published on

Published in: Internet
  • Be the first to comment

  • Be the first to like this

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

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

×