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

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

description

Доклад Андрея Смирнова на HighLoad++ 2014.

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

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

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

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

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

Backend

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

Чем занят 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)

Роль HTTP reverse proxy• Буферизация запроса

• Буферизация ответа

• “Борьба” с медленными клиентами

• “Снятие” HTTPS

• Отдача статики

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

Чем занят backend?

1. Склеивание строк

2. Сетевой ввод-вывод

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

Оптимизация backendа

• Увеличение производительности

• Уменьшение времени отклика

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

Параллелизм запросов

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

Параллелизм одного запроса

T

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

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

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

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

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

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

• fd = socket()

• listen(fd)/accept(fd)

• read(fd, buf)

• write(fd, buf)

• close(fd)

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

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

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

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

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

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

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

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

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

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

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

• Механизмы:

• select(), poll()

• epoll(), kqueue()

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

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

• do read/write until EAGAIN

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

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

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

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

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

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

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

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

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

Процессыcode

r/o

data

heap

code

r/o

data

heap

fork()

listen() accept()SHM

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

Примеры• Apache: mod_prefork

• FastCGI

• Phusion Passenger

• PostgreSQL

• …

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

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

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

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

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

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

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

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

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

• GIL

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

Примеры• MySQL

• Varnish

• …

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

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

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

• Явная: callbackи

• Неявная: green threads ↺

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

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

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

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

Что внутри• Отсортированный по времени срабатывания список таймеров + callback

• Список файловых дескрипторов для ожидания готовности + callback

• select(fds, min(timer)) ⇛ callbacks

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

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)

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)

Примеры• Redis

• memcached*

• …

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

Комбинированные варианты• M нитей : N кооперативных потоков

• nginx

• memcached

• …

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

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

• Очередь

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

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

• …

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

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

• на один запрос

• постоянное

TCP Connect Auth Send query Wait Result Disconnect

Send query Wait Result Send query Wait Result

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

Pipelining• Pipelining запросов

Send query Wait Result Send query Wait Result

Send query Result Send query Result

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

Proxy

•mcrouter

•twemproxy

•PgBouncer

•…

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

А что если backend сложнее?• Сервис-ориентированная архитектура

• Очереди, шины, асинхронная обработка задач

• Кеши, конфигурация, …

• …

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

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

h,p://www.123freevectors.com/soldier-skull-with-helmet-vector-art/

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

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

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

• AJAX, Timer, CSS3 Animation, …

• jQuery.Deferred()

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

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

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

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

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

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

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

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

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

• Event Machine

• Rack: middleware

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

Python• WSGI: middleware

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

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

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

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

Java• Потоки ОС

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

• Ne,y, Undertow, …

• Thread Pool

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

.NET• Потоки ОС

• async/await

• ASP.NET, ServiceStack, Nancy, …

• Mono

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

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

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

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

• Каналы

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

Erlang• Actor model

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

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

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

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

Спасибо! Вопросы?• Андрей Смирнов

• @smira

[email protected]

• h,p://smira.ru/