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(); Раздельное адресное  пространство
Классические серверные паттерны Процессы OS Pre-fork Обмен данными Shared memory Переменные процесса процессы Shared memory while MyFramework::init(); db=DB::connect(); while(accept…){     … } ,[object Object]
очереди
синхронизация,[object Object]
Классические серверные паттерны Потоки OS запросы 1 2 publicclassMyServletextendsHttpServlet{ privateUsercurrentUser; publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){ currentUser=authorizeUser(req); // ... resp.getWriter().println(currentUser) } } Петя Вася Петя Петя ошибка
Сравнение
Гибридные паттерны Процессы + потоки Несколько процессов (Worker MPM) В каждом процессе много потоков Увеличенная надежность Event MPM отдельный поток для Keep-Alive позволяет «рабочим» потокам работать дальше, пока висит Keep-Alive
COMET Long Poll Разрыв связи Конец запроса Разрыв связи Конец запроса t Соединение  не закрывается Соединение  не закрывается данные запрос данные запрос запрос
COMET Streaming Разрыв связи Конец запроса t Соединение не закрывается данные запрос данные данные запрос
Сравнение Обычный цикл Принять запрос Сгенерировать страничку Выдать страницу
Сравнение            COMET Принять запрос  ,[object Object]
ждать событияСгенерировать ответ Выдать ответ Особенности ,[object Object]
Потоки/процессы съедают ресурсы
Активная межпроцессная коммуникация
Небольшой размер ответа,[object Object]
Модель работы 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_YET Twistd пул потоков render_GET
Общие данные Пример COMET-приложения comet.pycomet.js все клиенты в одном массиве Twistd classClientManager: 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 Seconds Node.js nodejs.ru Streaming file uploads with node.js
Continuations(Jetty, GlassFish…) Запрос 1 ожидает сообщение  1 publicclassSubscribeServletextendsHttpServlet{ 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 инициирует событие 2 publicclassClientManager{ // 1. массив клиентов / запросов ArrayList<Continuation>continuations=newArrayList<Continuation>(); publicsynchronizedvoidbroadcastMessage(Stringmessage){ for(Continuationcontinuation:continuations){ } } } // 2. передать информациюо событии в continuation continuation.setAttribute("message",message); // 3. попросить сервер продолжить обработку continuation.resume(); можно в цикле выдавать ответы в запросы
Continuations  Сервер перезапускает запрос 1 1 1(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);
Характеристики метода Основан на потоках Используются все ядра Синхронизация, многопоточное программирование Многопоточная обработка оживших continuations publicsynchronizedvoidbroadcastMessage for(Continuationcontinuation:continuations){ // разбросает обработку continuations по потокам continuation.resume() }

More Related Content

What's hot

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

What's hot (20)

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

Viewers also liked

Alexei shilov 2010 rit-rakudo
Alexei shilov 2010 rit-rakudoAlexei shilov 2010 rit-rakudo
Alexei shilov 2010 rit-rakudorit2010
 
анатомия интернет банка Publish
анатомия интернет банка Publishанатомия интернет банка Publish
анатомия интернет банка Publishrit2010
 
Anatol filin pragmatic documentation 1_r
Anatol filin  pragmatic documentation 1_rAnatol filin  pragmatic documentation 1_r
Anatol filin pragmatic documentation 1_rrit2010
 
Alexandre.iline rit 2010 java_fxui_extra
Alexandre.iline rit 2010 java_fxui_extraAlexandre.iline rit 2010 java_fxui_extra
Alexandre.iline rit 2010 java_fxui_extrarit2010
 
анатомия интернет банка Publish
анатомия интернет банка Publishанатомия интернет банка Publish
анатомия интернет банка Publishrit2010
 
Sphinx new
Sphinx newSphinx new
Sphinx newrit2010
 
Microsoft cluster systems ritconf
Microsoft cluster systems ritconfMicrosoft cluster systems ritconf
Microsoft cluster systems ritconfrit2010
 
евгения б фирсова смена Web платформы на лету
евгения б  фирсова смена Web платформы  на летуевгения б  фирсова смена Web платформы  на лету
евгения б фирсова смена Web платформы на летуrit2010
 
анатолий шарифулин Mojolicious финальная версия
анатолий шарифулин Mojolicious   финальная версияанатолий шарифулин Mojolicious   финальная версия
анатолий шарифулин Mojolicious финальная версияrit2010
 
Moose talk at FOSDEM 2011 (Perl devroom)
Moose talk at FOSDEM 2011 (Perl devroom)Moose talk at FOSDEM 2011 (Perl devroom)
Moose talk at FOSDEM 2011 (Perl devroom)
xSawyer
 

Viewers also liked (10)

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

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

Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
Noveo
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajaxYandex
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxYandex
 
servlets1.pdf
servlets1.pdfservlets1.pdf
servlets1.pdf
ssuser0562f1
 
Service workers
Service workersService workers
servlets.pdf
servlets.pdfservlets.pdf
servlets.pdf
ssuser0562f1
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3Technopark
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
Sergey Teplyakov
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
Roman Brovko
 
Java весна 2014 лекция 2
Java весна 2014 лекция 2Java весна 2014 лекция 2
Java весна 2014 лекция 2Technopark
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3Technopark
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Java осень 2013 лекция 1-2
Java осень 2013 лекция 1-2Java осень 2013 лекция 1-2
Java осень 2013 лекция 1-2Technopark
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
Byndyusoft
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
JSib
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 

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

Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Mihail davidov js-ajax
Mihail davidov js-ajaxMihail davidov js-ajax
Mihail davidov js-ajax
 
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, AjaxМихаил Давыдов — Транспорт, Ajax
Михаил Давыдов — Транспорт, Ajax
 
servlets1.pdf
servlets1.pdfservlets1.pdf
servlets1.pdf
 
Service workers
Service workersService workers
Service workers
 
servlets.pdf
servlets.pdfservlets.pdf
servlets.pdf
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
Java весна 2014 лекция 2
Java весна 2014 лекция 2Java весна 2014 лекция 2
Java весна 2014 лекция 2
 
Web осень 2012 лекция 3
Web осень 2012 лекция 3Web осень 2012 лекция 3
Web осень 2012 лекция 3
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Java осень 2013 лекция 1-2
Java осень 2013 лекция 1-2Java осень 2013 лекция 1-2
Java осень 2013 лекция 1-2
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 

More from rit2010

Konstantin kolomeetz послание внутреннему заказчику
Konstantin kolomeetz послание внутреннему заказчикуKonstantin kolomeetz послание внутреннему заказчику
Konstantin kolomeetz послание внутреннему заказчикуrit2010
 
Bykov monitoring mailru
Bykov monitoring mailruBykov monitoring mailru
Bykov monitoring mailrurit2010
 
Alexander shigin slides
Alexander shigin slidesAlexander shigin slides
Alexander shigin slidesrit2010
 
иван василевич Eye tracking и нейрокомпьютерный интерфейс
иван василевич Eye tracking и нейрокомпьютерный интерфейсиван василевич Eye tracking и нейрокомпьютерный интерфейс
иван василевич Eye tracking и нейрокомпьютерный интерфейсrit2010
 
Andrey Petrov P D P
Andrey Petrov P D PAndrey Petrov P D P
Andrey Petrov P D Prit2010
 
Andrey Petrov методология P D P, часть 1, цели вместо кейсов
Andrey Petrov методология P D P, часть 1, цели вместо кейсовAndrey Petrov методология P D P, часть 1, цели вместо кейсов
Andrey Petrov методология P D P, часть 1, цели вместо кейсовrit2010
 
Dmitry lohansky rit2010
Dmitry lohansky rit2010Dmitry lohansky rit2010
Dmitry lohansky rit2010rit2010
 
Dmitry Lohansky Rit2010
Dmitry Lohansky Rit2010Dmitry Lohansky Rit2010
Dmitry Lohansky Rit2010rit2010
 
Related Queries Braslavski Yandex
Related Queries Braslavski YandexRelated Queries Braslavski Yandex
Related Queries Braslavski Yandexrit2010
 
молчанов сергей датацентры 10 04 2010 Light
молчанов сергей датацентры 10 04 2010  Lightмолчанов сергей датацентры 10 04 2010  Light
молчанов сергей датацентры 10 04 2010 Lightrit2010
 
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample SdkSergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdkrit2010
 
Serge P Nekoval Grails
Serge P  Nekoval GrailsSerge P  Nekoval Grails
Serge P Nekoval Grailsrit2010
 
Pavel Braslavski Related Queries Braslavski Yandex
Pavel Braslavski Related Queries Braslavski YandexPavel Braslavski Related Queries Braslavski Yandex
Pavel Braslavski Related Queries Braslavski Yandexrit2010
 
Max Lapshin Erlyvideo V2
Max Lapshin Erlyvideo V2Max Lapshin Erlyvideo V2
Max Lapshin Erlyvideo V2rit2010
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Socketsrit2010
 
Alexey Bazhin Balancing
Alexey Bazhin BalancingAlexey Bazhin Balancing
Alexey Bazhin Balancingrit2010
 
рит, нефункциональная структура команды, безуглый
рит, нефункциональная структура команды, безуглыйрит, нефункциональная структура команды, безуглый
рит, нефункциональная структура команды, безуглыйrit2010
 
левин михаил выступление на рит большие картинки
левин михаил выступление на рит   большие картинкилевин михаил выступление на рит   большие картинки
левин михаил выступление на рит большие картинкиrit2010
 
левин михаил выступление на рит
левин михаил выступление на ритлевин михаил выступление на рит
левин михаил выступление на ритrit2010
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 

More from rit2010 (20)

Konstantin kolomeetz послание внутреннему заказчику
Konstantin kolomeetz послание внутреннему заказчикуKonstantin kolomeetz послание внутреннему заказчику
Konstantin kolomeetz послание внутреннему заказчику
 
Bykov monitoring mailru
Bykov monitoring mailruBykov monitoring mailru
Bykov monitoring mailru
 
Alexander shigin slides
Alexander shigin slidesAlexander shigin slides
Alexander shigin slides
 
иван василевич Eye tracking и нейрокомпьютерный интерфейс
иван василевич Eye tracking и нейрокомпьютерный интерфейсиван василевич Eye tracking и нейрокомпьютерный интерфейс
иван василевич Eye tracking и нейрокомпьютерный интерфейс
 
Andrey Petrov P D P
Andrey Petrov P D PAndrey Petrov P D P
Andrey Petrov P D P
 
Andrey Petrov методология P D P, часть 1, цели вместо кейсов
Andrey Petrov методология P D P, часть 1, цели вместо кейсовAndrey Petrov методология P D P, часть 1, цели вместо кейсов
Andrey Petrov методология P D P, часть 1, цели вместо кейсов
 
Dmitry lohansky rit2010
Dmitry lohansky rit2010Dmitry lohansky rit2010
Dmitry lohansky rit2010
 
Dmitry Lohansky Rit2010
Dmitry Lohansky Rit2010Dmitry Lohansky Rit2010
Dmitry Lohansky Rit2010
 
Related Queries Braslavski Yandex
Related Queries Braslavski YandexRelated Queries Braslavski Yandex
Related Queries Braslavski Yandex
 
молчанов сергей датацентры 10 04 2010 Light
молчанов сергей датацентры 10 04 2010  Lightмолчанов сергей датацентры 10 04 2010  Light
молчанов сергей датацентры 10 04 2010 Light
 
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample SdkSergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
 
Serge P Nekoval Grails
Serge P  Nekoval GrailsSerge P  Nekoval Grails
Serge P Nekoval Grails
 
Pavel Braslavski Related Queries Braslavski Yandex
Pavel Braslavski Related Queries Braslavski YandexPavel Braslavski Related Queries Braslavski Yandex
Pavel Braslavski Related Queries Braslavski Yandex
 
Max Lapshin Erlyvideo V2
Max Lapshin Erlyvideo V2Max Lapshin Erlyvideo V2
Max Lapshin Erlyvideo V2
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Alexey Bazhin Balancing
Alexey Bazhin BalancingAlexey Bazhin Balancing
Alexey Bazhin Balancing
 
рит, нефункциональная структура команды, безуглый
рит, нефункциональная структура команды, безуглыйрит, нефункциональная структура команды, безуглый
рит, нефункциональная структура команды, безуглый
 
левин михаил выступление на рит большие картинки
левин михаил выступление на рит   большие картинкилевин михаил выступление на рит   большие картинки
левин михаил выступление на рит большие картинки
 
левин михаил выступление на рит
левин михаил выступление на ритлевин михаил выступление на рит
левин михаил выступление на рит
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин 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.
  • 5.
  • 6. Классические серверные паттерны Потоки OS запросы 1 2 publicclassMyServletextendsHttpServlet{ privateUsercurrentUser; publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp){ currentUser=authorizeUser(req); // ... resp.getWriter().println(currentUser) } } Петя Вася Петя Петя ошибка
  • 8. Гибридные паттерны Процессы + потоки Несколько процессов (Worker MPM) В каждом процессе много потоков Увеличенная надежность Event MPM отдельный поток для Keep-Alive позволяет «рабочим» потокам работать дальше, пока висит Keep-Alive
  • 9. COMET Long Poll Разрыв связи Конец запроса Разрыв связи Конец запроса t Соединение не закрывается Соединение не закрывается данные запрос данные запрос запрос
  • 10. COMET Streaming Разрыв связи Конец запроса t Соединение не закрывается данные запрос данные данные запрос
  • 11. Сравнение Обычный цикл Принять запрос Сгенерировать страничку Выдать страницу
  • 12.
  • 13.
  • 16.
  • 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_YET Twistd пул потоков render_GET
  • 18. Общие данные Пример COMET-приложения comet.pycomet.js все клиенты в одном массиве Twistd classClientManager: 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 Seconds Node.js nodejs.ru Streaming file uploads with node.js
  • 21. Continuations(Jetty, GlassFish…) Запрос 1 ожидает сообщение 1 publicclassSubscribeServletextendsHttpServlet{ 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 инициирует событие 2 publicclassClientManager{ // 1. массив клиентов / запросов ArrayList<Continuation>continuations=newArrayList<Continuation>(); publicsynchronizedvoidbroadcastMessage(Stringmessage){ for(Continuationcontinuation:continuations){ } } } // 2. передать информациюо событии в continuation continuation.setAttribute("message",message); // 3. попросить сервер продолжить обработку continuation.resume(); можно в цикле выдавать ответы в запросы
  • 23. Continuations Сервер перезапускает запрос 1 1 1(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. Характеристики метода Основан на потоках Используются все ядра Синхронизация, многопоточное программирование Многопоточная обработка оживших continuations publicsynchronizedvoidbroadcastMessage for(Continuationcontinuation:continuations){ // разбросает обработку continuations по потокам continuation.resume() }
  • 25. Почитать Continuations to Continue Continuations (статья старовата) JSR-000315 JavaServlet 3.0 (Спецификация) Glassfish
  • 26. Микронити Erlang, Stackless Python, … Предыдущие подходы: Сохранить запрос в памяти и освободить поток для нового запроса Микронити: Сделать поток максимально «легким» - и можно не освобождать Решение: отказ от потоков и стека OS, свои потоки
  • 28. Почитать A Million-user Comet Application with Mochiweb: Part 1, Part 2, Part 3 Building an Erlang chat server with Comet: Part1, Part 2, Part 3 Comet web chat (with MochiWeb) Using the mochiweb project skeleton Mochiweb source Документация к API Erlang Официальный сайт Erlang in Practice(screencast)