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.

Анатомия веб-сервиса (РИТ-2014)

2,615 views

Published on

Published in: Engineering

Анатомия веб-сервиса (РИТ-2014)

  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/   • Мастер-­‐класс  с  практическими  заданиями

×