Event Handling Patterns Reactor Proactor Eventhandling patterns Nae
- Slides: 18
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 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 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 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í
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í, 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 - 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 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 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 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 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 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. 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 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á 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
- Nae theodorescu
- Nae zamfir
- Event handling in ada
- Java event handler example
- Swing layouts
- Event handling in android
- Java gui event handling
- Bridge breaks in central java
- Independent or dependent
- To inform the readers/listeners about a newsworthy event
- Independent vs dependent events
- Near miss sentinel event
- 5 w's event management
- Simple and compound events examples
- Design equation
- Reactor pattern
- A and b react as per the reaction
- Reactor pattern example
- Safurex chemical composition