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

2,174
-1

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/   • Мастер-­‐класс  с  практическими  заданиями
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×