SlideShare uma empresa Scribd logo
1 de 24
ПаттерныСерверных 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() }

Mais conteúdo relacionado

Mais procurados

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 FedorFedor 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 + ReduxFrontDays
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)Ontico
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationAlexey 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
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
лабораторная работа №1
лабораторная работа №1лабораторная работа №1
лабораторная работа №1НГТУ
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015OSLL
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practiceAlexey Lesovsky
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколыRoman Brovko
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4Technopark
 

Mais procurados (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
 

Destaque

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
 

Destaque (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)
 

Semelhante a 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
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3Technopark
 
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/awaitByndyusoft
 
Бодрящий микс из 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.NETPositive Hack Days
 

Semelhante a 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
 

Mais de 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
 

Mais de 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)