Event Handling Patterns Reactor Proactor Eventhandling patterns Nae

  • Slides: 18
Download presentation
Event Handling Patterns Reactor, Proactor

Event Handling Patterns Reactor, Proactor

Event-handling patterns Naše zaměření: síťově orientované systémy Popisují způsob, jakým iniciovat, přijmout, demultiplexovat, dispatchovat

Event-handling patterns Naše zaměření: síťově orientované systémy Popisují způsob, jakým iniciovat, přijmout, demultiplexovat, dispatchovat a zpracovat události (eventy) v síťově orientovaném systému Návrhové vzory Reactor Proactor

Reactor – Motivační příklad Distribuovaná logovací služba klienti posílají logy na centrální logovací server

Reactor – Motivační příklad Distribuovaná logovací služba klienti posílají logy na centrální logovací server od klientů vznikají dvě události connect – nový klient žádá o připojení read – klient má k dispozici nové položky do logu simultánní příchod události obsluha má krátké trvání

Pokus o řešení Pro každé připojení vytvořit nové vlákno nutno zabezpečit thread-safety již při

Pokus o řešení Pro každé připojení vytvořit nové vlákno nutno zabezpečit thread-safety již při pár tisících požadavků neúnosná režie vlákna nejsou podporována na všech systémech špatně se debuguje

Pokus o řešení

Pokus o řešení

Reactor řeší rozdělení (demultiplexing) a následné zpracování (dispatching) příchozích eventů reactor čeká synchronně na

Reactor řeší rozdělení (demultiplexing) a následné zpracování (dispatching) příchozích eventů reactor čeká synchronně na událost z mnoha zdrojů, informující o dostupnosti operace informace typu „tuhle akci můžeš udělat, aniž by čekala“ najde event handler přiřazený příslušnému zdroji (demultiplexing) na event handleru zavolá metodu odpovídající události (dispatching) event handler synchronně zareaguje na událost vykonávání se vrátí zpět k reactoru, který opět začne čekat Reactor se může „dočkat“ několika událostí najednou v tom případě zpracuje všechny události a pak až znovu začne čekat Také známý jako Dispatcher nebo Notifier

Reactor - struktura Handle libovolný zdroj, na který se umí čekat obvykle síťová připojení,

Reactor - struktura Handle libovolný zdroj, na který se umí čekat obvykle síťová připojení, soubory Synchronous Event Demultiplexer jeho zavolání vyvolá blokující čekání jakmile je možné začít synchronní operaci na handle bez blokování, pošle handle a informaci o události na dispatcher Dispatcher udržuje si tabulku registrovaných handlerů odešle handle z demultiplexeru na asociovaný event handler Event handler komponenta aplikace implementující zpracování daného eventu aplikace využívá demultiplexing a dispatching poskytnutý reactorem

Reactor – diagram struktury

Reactor – diagram struktury

Reactor - implementace Synchronous Event Demultiplexer pro efektivitu většinou vyžaduje podporu operačního systému existuje

Reactor - implementace Synchronous Event Demultiplexer pro efektivitu většinou vyžaduje podporu operačního systému existuje „vidlácká“ implementace (loop, který kontroluje is. Ready flagy) Registrace handlů může proběhnout pouze před spuštěním reactoru, případně jako obsluha události skvěle se hodí vzor Acceptor-Connector speciální „new connection“ handle, jejíž handler přidá event handler pro nového klienta

Reactor Výhody rozdělení zodpovědností mezi reactor a aplikaci umožňuje modularitu, znovupoužitelnost, přenositelnost aplikace implementuje

Reactor Výhody rozdělení zodpovědností mezi reactor a aplikaci umožňuje modularitu, znovupoužitelnost, přenositelnost aplikace implementuje pouze obsluhu umožňuje obsloužit více současných spojení bez režie multiple threads ale jen na principu serializace volání jednotlivých event handlerů Nevýhody handlery nemůžou dělat moc práce jakékoliv blokující volání v obsluze zablokuje celý proces netriviální udržení stavu bufferování necelých zpráv řetězec po sobě jdoucích událostí náročné ladění a testování

Reactor – Příklady, použití Příklad ze života - telefonní linka Poskytovatel telefonní sítě je

Reactor – Příklady, použití Příklad ze života - telefonní linka Poskytovatel telefonní sítě je reactor Vy jste event handler, vaše telefonní číslo je handle Pokud se vám někdo chce dovolat, zazvoní vám telefon a poskytovatel bude čekat, až ho zvednete Po zvednutí (signál „jsem k dispozici“) vás spojí s protějškem a během hovoru je vaše linka blokována Reálné implementace Reactor (Java), Twisted (Python), React. PHP (PHP), Xt (UI toolkit v UNIXu)

Proactor – Proč reactor nestačí? V obsluze události chceme často poslat klientovi odpověď Nápad

Proactor – Proč reactor nestačí? V obsluze události chceme často poslat klientovi odpověď Nápad na řešení jenže to je typická blokující operace! event handler „request“ si připraví buffer s odpovědí zaregistruje event handler na event „je možno zapisovat“ postupně při každém vyvolání tohoto eventu zapisuje buffer s odpovědí Toto za nás však často umí udělat operační systém pomocí asynchronních operací! operačnímu systému zadáme práci a dozvíme se, až ji dokončí v Reactoru nám operační systém dal vědět, kdy můžeme práci vykonávat sami

Proactor Aktivní event demultiplexing and dispatching model Využívá Asynchronous Operation Processor Implementovaný operačním systémem

Proactor Aktivní event demultiplexing and dispatching model Využívá Asynchronous Operation Processor Implementovaný operačním systémem typicky pro I/O operace Rozdělení aplikačních služeb na dvě části asynchronní (můžou být dlouho trvající) operace (které jsou volány proaktivně) completion handlery – stará se o zpracování výsledku asynchronní operace

Proactor - struktura

Proactor - struktura

Proactor Obecné výhody a nevýhody stejné jako u reactoru Je implementován například v. NET

Proactor Obecné výhody a nevýhody stejné jako u reactoru Je implementován například v. NET frameworku (begin/end metody)

Proactor private void Start() { tcp. Listener = new Tcp. Listener(IPAddress. Any, 8080); tcp.

Proactor private void Start() { tcp. Listener = new Tcp. Listener(IPAddress. Any, 8080); tcp. Listener. Start(); //Start async accept with Accept. Tcp. Client. Handler as Completion. Handler tcp. Listener. Begin. Accept. Tcp. Client(Accept. Tcp. Client. Handler, null); } private void Accept. Tcp. Client. Handler(IAsync. Result ia) { Tcp. Client cli = tcp. Listener. End. Accept. Tcp. Client(ia); Client. State state = new Client. State(cli); cli. Get. Stream(). Begin. Read(state. Buffer, 0, 1024, Read. Finished. Client. Handler, state); tcp. Listener. Begin. Accept. Tcp. Client(Accept. Tcp. Client. Handler, null); } private void Read. Finished. Client. Handler(IAsync. Result ia) { Client. State state = (Client. State)ia. Async. State; int bytes. Read = state. Client. Get. Stream(). End. Read(ia); state. Client. Get. Stream(). Begin. Write(state. Buffer, 0, bytes. Read, Write. Finished. Client. Handler, state); } private void Write. Finished. Client. Handler(IAsync. Result ia) { Client. State state = (Client. State)ia. Async. State; state. Client. Get. Stream(). Begin. Read(state. Buffer, 0, 1024, Read. Finished. Client. Handler, state); }

Proactor – Příklad ze života, použití Vzkaz na záznamníku zavolám momentálně nedostupné kamarádce nechám

Proactor – Příklad ze života, použití Vzkaz na záznamníku zavolám momentálně nedostupné kamarádce nechám ji (jako initiator) vzkaz na záznamníku (zde asynchronous operation processor), ať mi zjistí nějakou informaci během čekání mohu vykonávat libovolnou jinou činnost kamarádka zjistí, že má ode mě vzkaz, a vyhledá pro mě tuto informaci zavolá zpět ve chvíli, kdy tu informaci již má (Proactor) zvednu telefon a představím se jako Completion handler Reálné implementace Windows: completion ports UNIX: POSIX AIO (asynchronous I/O) Obsluha přerušení v OS C++: Boost. Asio, ACE

Proactor vs Reactor Společná myšlenka Reactor snaha o nahrazení multithreadingu v event-driven systémech čeká

Proactor vs Reactor Společná myšlenka Reactor snaha o nahrazení multithreadingu v event-driven systémech čeká na informaci, že může vykonat nějakou operaci bez blokování, a pak ji synchronně vykoná samotná obsluha události pak probíhá synchronně v rámci programu Proactor asynchronně vykonává operace a čeká na informaci, že tyto operace byly dokončeny vyžaduje o dost pokročilejší podporu operačního systému