SlideShare a Scribd company logo
ПаттерныСерверных COMET-решенийИлья Канторhttp://javascript.ru
Классические серверные паттерныПроцессы OSпроцессы// инициализация фреймворкаincludeMyFramework;MyFramework::init();db=DB::connect();// while ждеточереднойзапросwhile(request=FastCGI::accept()){MyFramework::process(request);}MyFramework::finalize();Раздельноеадресное пространство
Классические серверные паттерныПроцессы OSPre-forkОбмен даннымиShared memoryПеременные процессапроцессыShared memorywhileMyFramework::init();db=DB::connect();while(accept…){    …} данные (строки)
очереди
синхронизацияКлассические серверные паттерныПотоки OSпул потоковобъект MyServletпотокиОбщееадресное пространствоpublicclassMyServletextendsHttpServlet{privateUsercurrentUser;publicvoiddoGet(…req,…resp){currentUser=authorizeUser(req);// ...resp.getWriter().println(currentUser)}}doGet
Классические серверные паттерныПотоки OSзапросы12publicclassMyServletextendsHttpServlet{privateUsercurrentUser;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){currentUser=authorizeUser(req);// ...resp.getWriter().println(currentUser)}}ПетяВасяПетяПетяошибка
Сравнение
Гибридные паттерныПроцессы + потокиНесколько процессов (Worker MPM)В каждом процессе много потоковУвеличенная надежностьEvent MPMотдельный поток для Keep-Aliveпозволяет «рабочим» потокам работать дальше, пока висит Keep-Alive
COMETLong PollРазрыв связиКонец запросаРазрыв связиКонец запросаtСоединение не закрываетсяСоединение не закрываетсяданныезапросданныезапросзапрос
COMETStreamingРазрыв связиКонец запросаtСоединение не закрываетсяданныезапросданныеданныезапрос
СравнениеОбычный циклПринять запросСгенерировать страничкуВыдать страницу
Сравнение           COMETПринять запрос посетитель подключился
ждать событияСгенерировать ответВыдать ответОсобенностиБольшое количество ожидающих соединений
Потоки/процессы съедают ресурсы
Активная межпроцессная коммуникация
Небольшой размер ответаСобытия в едином потокеTwisted, node.jsвсе действия, которые требуют ожидания, совершаются асинхронноsimple.pydbpool=adbapi.ConnectionPool("MySQLdb",host="localhost",db="test”)classMyResource(resource.Resource):deflogin(self,result,request):ifresult: request.write("Привет, %s! Твой ID:%d"%result[0])else: request.write("Я Вас не знаю!")request.finish()defrender_GET(self,request):name=request.args['name']deferred=dbpool.runQuery("SELECT * FROM users WHERE name = '%s' "%name)deferred.addCallback(lambdaresult:self.login(result,request))returnserver.NOT_DONE_YET
Модель работыclassMyResource(resource.Resource):    deflogin(self,result,request):request.write(“…"%result)request.finish()    defrender_GET(self,request):name=request.args['name']deferred=dbpool.runQuery("…"%name)deferred.addCallback(self.login)returnserver.NOT_DONE_YETTwistdпул потоковrender_GET
Общие данныеПример COMET-приложенияcomet.pycomet.jsвсе клиенты в одном массивеTwistdclassClientManager:clients=[]defregisterClient(self,client):self.clients.append(client)defbroadcastMessage(self,message):forclientinself.clients:client.write(message)client.finish()self.clients=[]
Характеристики методаДля удобного асинхронного вызова нужно Async APIХорошо когда оно естьПлохо, что оно не всегда естьНет синхронизацииОсновной процесс использует только 1 ядроЧто делать при 100% загрузке CPU?Выделять сложные операции в потоки (Python – GIL, сетевые операции не thread-safe)Запускать несколько экземпляров (процессов) сервера (данные не в едином адресном пространстве)
ПочитатьTwistedОфициальная документация и учебникTwisted.Web In 60 SecondsNode.jsnodejs.ruStreaming file uploads with node.js
Continuations(Jetty, GlassFish…)Запрос 1 ожидает сообщение 1publicclassSubscribeServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){}// 1. запрос «упаковывается» в объект continuation  Continuationcontinuation=ContinuationSupport.getContinuation(req);if(continuation.isInitial()){  // true// 2. сообщить серверу, что запрос неоконченcontinuation.suspend();}// 3. передать continuation асинхронному обработчикуClientManager.getInstance().registerClient(continuation);Continuation (неоконченный запрос)«подвис» на сервере
Continuations Запрос 2 инициирует событие2publicclassClientManager{// 1. массив клиентов / запросовArrayList<Continuation>continuations=newArrayList<Continuation>();publicsynchronizedvoidbroadcastMessage(Stringmessage){for(Continuationcontinuation:continuations){}}}// 2. передать информациюо событии в continuationcontinuation.setAttribute("message",message);// 3. попросить сервер продолжить обработкуcontinuation.resume();можно в цикле выдавать ответы в запросы
Continuations Сервер перезапускает запрос 111(2)publicclassSubscribeServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){}// 1(2).возвратит объект сontinuation, соответствующий запросуContinuationcontinuation=ContinuationSupport.getContinuation(req);if(continuation.isInitial()){    // true             // 1(1). сообщить серверу, что запрос неоконченcontinuation.suspend();}else{}// false// 1(1). передать continuation асинхронному обработчикуClientManager.getInstance().registerClient(continuation);Stringmessage=(String)continuation.getAttribute("message");resp.getWriter().print(message);
Характеристики методаОснован на потокахИспользуются все ядраСинхронизация, многопоточное программированиеМногопоточная обработка оживших continuationspublicsynchronizedvoidbroadcastMessagefor(Continuationcontinuation:continuations){// разбросает обработку continuations по потокамcontinuation.resume()}

More Related Content

PPT
Smirnov Memcached Highload 2008
PPT
Smirnov Memcached High Load 2008
PPT
Сергей Париев - "обработка дедлоков в MySql"
PPTX
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
PDF
Практическое применение HTML5 в Я.Почте
PDF
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
PPT
использование Hibernate java persistence.part 4.
PDF
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Smirnov Memcached Highload 2008
Smirnov Memcached High Load 2008
Сергей Париев - "обработка дедлоков в MySql"
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Практическое применение HTML5 в Я.Почте
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
использование Hibernate java persistence.part 4.
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

What's hot (20)

PPTX
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
PDF
Асинхронный JavaScript
PDF
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
PDF
Moscow DevOps meetup 18.05.13
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
PDF
Пространства имен Linux (linux namespaces)
PDF
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
PDF
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
PDF
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
PPTX
Java threads - part 1
PDF
PostgreSQL Streaming Replication
PDF
Konstantin Krivlenia - "Continuous integration for frontend"
PDF
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
PPTX
Java threads - part 3
PDF
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
DOC
лабораторная работа №1
PDF
Linuxvirt seminar-csc-2015
PDF
Streaming replication in practice
PDF
05 - Web-технологии. Сетевые протоколы
PDF
Android осень 2013 лекция 4
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Асинхронный JavaScript
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
Moscow DevOps meetup 18.05.13
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Пространства имен Linux (linux namespaces)
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Java threads - part 1
PostgreSQL Streaming Replication
Konstantin Krivlenia - "Continuous integration for frontend"
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Java threads - part 3
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
лабораторная работа №1
Linuxvirt seminar-csc-2015
Streaming replication in practice
05 - Web-технологии. Сетевые протоколы
Android осень 2013 лекция 4
Ad

Viewers also liked (10)

PDF
Alexei shilov 2010 rit-rakudo
PPT
анатомия интернет банка Publish
PPT
Anatol filin pragmatic documentation 1_r
ODP
Alexandre.iline rit 2010 java_fxui_extra
PPT
анатомия интернет банка Publish
PDF
Sphinx new
PPTX
Microsoft cluster systems ritconf
PPTX
евгения б фирсова смена Web платформы на лету
PDF
анатолий шарифулин Mojolicious финальная версия
ODP
Moose talk at FOSDEM 2011 (Perl devroom)
Alexei shilov 2010 rit-rakudo
анатомия интернет банка Publish
Anatol filin pragmatic documentation 1_r
Alexandre.iline rit 2010 java_fxui_extra
анатомия интернет банка Publish
Sphinx new
Microsoft cluster systems ritconf
евгения б фирсова смена Web платформы на лету
анатолий шарифулин Mojolicious финальная версия
Moose talk at FOSDEM 2011 (Perl devroom)
Ad

Similar to Ilia kantor паттерны серверных comet решений (20)

PPT
Эффективное программирование на NodeJS
PDF
JavaScript. Event Loop and Timers (in russian)
PPT
Node.JS: возможности для РНР-разработчика
PDF
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
PDF
Анатомия веб сервиса (HighLoad-2014)
PPT
ВВЕДЕНИЕ В NODE.JS
PDF
Анатомия веб-сервиса, Андрей Смирнов
PDF
Анатомия веб-сервиса (РИТ-2014)
PPT
Типичный стек технологий для использования с Node.js
PDF
Курс высокие нагрузки: сеть (отрывок)
PDF
JavaScript. Async (in Russian)
PDF
Михаил Давыдов: JavaScript. Асинхронность
PPT
Node.js (Андрей Костенко)
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PPTX
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
PPT
Hl2008 Hp Server Design 169
PDF
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
PDF
JavaScript Базовый. Занятие 09.
PDF
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
PPTX
Асинхронная обработка данных: RabbitMQ, Comet
Эффективное программирование на NodeJS
JavaScript. Event Loop and Timers (in russian)
Node.JS: возможности для РНР-разработчика
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб сервиса (HighLoad-2014)
ВВЕДЕНИЕ В NODE.JS
Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса (РИТ-2014)
Типичный стек технологий для использования с Node.js
Курс высокие нагрузки: сеть (отрывок)
JavaScript. Async (in Russian)
Михаил Давыдов: JavaScript. Асинхронность
Node.js (Андрей Костенко)
Node.js введение в технологию, КПИ #ITmeetingKPI
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Hl2008 Hp Server Design 169
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
JavaScript Базовый. Занятие 09.
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Асинхронная обработка данных: RabbitMQ, Comet

More from rit2010 (20)

PDF
Konstantin kolomeetz послание внутреннему заказчику
PDF
Bykov monitoring mailru
PDF
Alexander shigin slides
PPTX
иван василевич Eye tracking и нейрокомпьютерный интерфейс
PPT
Andrey Petrov P D P
PPT
Andrey Petrov методология P D P, часть 1, цели вместо кейсов
PDF
Dmitry lohansky rit2010
PDF
Dmitry Lohansky Rit2010
PPTX
Related Queries Braslavski Yandex
PPTX
молчанов сергей датацентры 10 04 2010 Light
PPTX
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
PPT
Serge P Nekoval Grails
PPTX
Pavel Braslavski Related Queries Braslavski Yandex
PDF
Max Lapshin Erlyvideo V2
PPT
Eugene Lisitsky Web Sockets
PDF
Alexey Bazhin Balancing
PDF
рит, нефункциональная структура команды, безуглый
PDF
левин михаил выступление на рит большие картинки
PDF
левин михаил выступление на рит
PPTX
антон веснин Rails Application Servers
Konstantin kolomeetz послание внутреннему заказчику
Bykov monitoring mailru
Alexander shigin slides
иван василевич Eye tracking и нейрокомпьютерный интерфейс
Andrey Petrov P D P
Andrey Petrov методология P D P, часть 1, цели вместо кейсов
Dmitry lohansky rit2010
Dmitry Lohansky Rit2010
Related Queries Braslavski Yandex
молчанов сергей датацентры 10 04 2010 Light
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Serge P Nekoval Grails
Pavel Braslavski Related Queries Braslavski Yandex
Max Lapshin Erlyvideo V2
Eugene Lisitsky Web Sockets
Alexey Bazhin Balancing
рит, нефункциональная структура команды, безуглый
левин михаил выступление на рит большие картинки
левин михаил выступление на рит
антон веснин Rails Application Servers

Ilia kantor паттерны серверных comet решений

  • 2. Классические серверные паттерныПроцессы OSпроцессы// инициализация фреймворкаincludeMyFramework;MyFramework::init();db=DB::connect();// while ждеточереднойзапросwhile(request=FastCGI::accept()){MyFramework::process(request);}MyFramework::finalize();Раздельноеадресное пространство
  • 3. Классические серверные паттерныПроцессы OSPre-forkОбмен даннымиShared memoryПеременные процессапроцессыShared memorywhileMyFramework::init();db=DB::connect();while(accept…){ …} данные (строки)
  • 5. синхронизацияКлассические серверные паттерныПотоки OSпул потоковобъект MyServletпотокиОбщееадресное пространствоpublicclassMyServletextendsHttpServlet{privateUsercurrentUser;publicvoiddoGet(…req,…resp){currentUser=authorizeUser(req);// ...resp.getWriter().println(currentUser)}}doGet
  • 6. Классические серверные паттерныПотоки OSзапросы12publicclassMyServletextendsHttpServlet{privateUsercurrentUser;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){currentUser=authorizeUser(req);// ...resp.getWriter().println(currentUser)}}ПетяВасяПетяПетяошибка
  • 8. Гибридные паттерныПроцессы + потокиНесколько процессов (Worker MPM)В каждом процессе много потоковУвеличенная надежностьEvent MPMотдельный поток для Keep-Aliveпозволяет «рабочим» потокам работать дальше, пока висит Keep-Alive
  • 9. COMETLong PollРазрыв связиКонец запросаРазрыв связиКонец запросаtСоединение не закрываетсяСоединение не закрываетсяданныезапросданныезапросзапрос
  • 10. COMETStreamingРазрыв связиКонец запросаtСоединение не закрываетсяданныезапросданныеданныезапрос
  • 12. Сравнение COMETПринять запрос посетитель подключился
  • 13. ждать событияСгенерировать ответВыдать ответОсобенностиБольшое количество ожидающих соединений
  • 16. Небольшой размер ответаСобытия в едином потокеTwisted, node.jsвсе действия, которые требуют ожидания, совершаются асинхронноsimple.pydbpool=adbapi.ConnectionPool("MySQLdb",host="localhost",db="test”)classMyResource(resource.Resource):deflogin(self,result,request):ifresult: request.write("Привет, %s! Твой ID:%d"%result[0])else: request.write("Я Вас не знаю!")request.finish()defrender_GET(self,request):name=request.args['name']deferred=dbpool.runQuery("SELECT * FROM users WHERE name = '%s' "%name)deferred.addCallback(lambdaresult:self.login(result,request))returnserver.NOT_DONE_YET
  • 17. Модель работыclassMyResource(resource.Resource): deflogin(self,result,request):request.write(“…"%result)request.finish() defrender_GET(self,request):name=request.args['name']deferred=dbpool.runQuery("…"%name)deferred.addCallback(self.login)returnserver.NOT_DONE_YETTwistdпул потоковrender_GET
  • 18. Общие данныеПример COMET-приложенияcomet.pycomet.jsвсе клиенты в одном массивеTwistdclassClientManager:clients=[]defregisterClient(self,client):self.clients.append(client)defbroadcastMessage(self,message):forclientinself.clients:client.write(message)client.finish()self.clients=[]
  • 19. Характеристики методаДля удобного асинхронного вызова нужно Async APIХорошо когда оно естьПлохо, что оно не всегда естьНет синхронизацииОсновной процесс использует только 1 ядроЧто делать при 100% загрузке CPU?Выделять сложные операции в потоки (Python – GIL, сетевые операции не thread-safe)Запускать несколько экземпляров (процессов) сервера (данные не в едином адресном пространстве)
  • 20. ПочитатьTwistedОфициальная документация и учебникTwisted.Web In 60 SecondsNode.jsnodejs.ruStreaming file uploads with node.js
  • 21. Continuations(Jetty, GlassFish…)Запрос 1 ожидает сообщение 1publicclassSubscribeServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){}// 1. запрос «упаковывается» в объект continuation Continuationcontinuation=ContinuationSupport.getContinuation(req);if(continuation.isInitial()){ // true// 2. сообщить серверу, что запрос неоконченcontinuation.suspend();}// 3. передать continuation асинхронному обработчикуClientManager.getInstance().registerClient(continuation);Continuation (неоконченный запрос)«подвис» на сервере
  • 22. Continuations Запрос 2 инициирует событие2publicclassClientManager{// 1. массив клиентов / запросовArrayList<Continuation>continuations=newArrayList<Continuation>();publicsynchronizedvoidbroadcastMessage(Stringmessage){for(Continuationcontinuation:continuations){}}}// 2. передать информациюо событии в continuationcontinuation.setAttribute("message",message);// 3. попросить сервер продолжить обработкуcontinuation.resume();можно в цикле выдавать ответы в запросы
  • 23. Continuations Сервер перезапускает запрос 111(2)publicclassSubscribeServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){}// 1(2).возвратит объект сontinuation, соответствующий запросуContinuationcontinuation=ContinuationSupport.getContinuation(req);if(continuation.isInitial()){ // true // 1(1). сообщить серверу, что запрос неоконченcontinuation.suspend();}else{}// false// 1(1). передать continuation асинхронному обработчикуClientManager.getInstance().registerClient(continuation);Stringmessage=(String)continuation.getAttribute("message");resp.getWriter().print(message);
  • 24. Характеристики методаОснован на потокахИспользуются все ядраСинхронизация, многопоточное программированиеМногопоточная обработка оживших continuationspublicsynchronizedvoidbroadcastMessagefor(Continuationcontinuation:continuations){// разбросает обработку continuations по потокамcontinuation.resume()}
  • 25. ПочитатьContinuations to ContinueContinuations (статья старовата)JSR-000315 JavaServlet 3.0 (Спецификация)Glassfish
  • 26. МикронитиErlang, Stackless Python, …Предыдущие подходы:Сохранить запрос в памяти и освободить поток для нового запросаМикронити:Сделать поток максимально «легким» - и можно не освобождатьРешение: отказ от потоков и стека OS, свои потоки
  • 28. ПочитатьA Million-user Comet Application with Mochiweb: Part 1, Part 2, Part 3Building an Erlang chat server with Comet: Part1, Part 2, Part 3 Comet web chat (with MochiWeb)Using the mochiweb project skeletonMochiweb sourceДокументация к APIErlangОфициальный сайтErlang in Practice(screencast)