Technologia Programowania 2016/2017 Wykªad 9 Programowanie sieciowe, Akka Jakub Lemiesz
Podsumowanie poj Przetwarzanie wspóªbie»ne vs. równolegªe (Concurrency vs. Parallelism) 1 Concurrency - dwa albo wi cej zada«mo»e robi post py, nawet je±li nie s wykonywane równolegle 2 Parallelism - wykonania zada«s naprawd równolegªe 2 / 35
Podsumowanie poj Model synchroniczny vs. asynchroniczny 1 W modelu synchronicznym czekaj c na rezultat» dania 'blokujemy' dost p do procesora 2 W modelu asynchronicznym czekaj c na rezultat» dania nie blokujemy, b dziemy powiadomieni gdy rezultat si pojawi 3 Asynchroniczno± cz sto jest preferowana, gwarantuje post p 3 / 35
Model asynchroniczny 4 / 35
Model asynchroniczny 4 / 35
Model asynchroniczny motywacja Model asynchroniczny sprawdza si gdy: 1 wiele zada«(szansa,»e b dzie niezablokowane) 2 zadania wykonuj wiele operacji I/O 3 zadania s w niewielki stopniu zale»ne od siebie (nie musz si nawzajem komunikowa ) Warunki te charakteryzuj architektur klient-serwer: 1» dania klientów s niezale»ne (np. web-server) 2 mamy wiele operacji I/O - klient wysyªa» danie i dostaje odpowied¹, któr dªugo przetwarza... 5 / 35
Komunikacja klient-serwer w Java 6 / 35
Architektura klient-serwer 1 Jak zorganizowa prac Selectora? C10K Problem 2 Handler dla klienta czy dla typu zadania? 3 Osobny w tek dla ka»dego klienta? Thread Pool? 7 / 35
Selector: event-driven programming 8 / 35
Wzorzec Reactor: diagram klas EventHandler: interfejs, konkretne handler'y sªu» do obsªugi zdarze«okre±lonego typu. S rejestrowane i wywoªywane kiedy pojawi si odpowiednie zdarzenie ( callbacks, handler==agent) Handle: uchwyt do ¹ródªa zdarzenia (np. gniazdo, widget, plik) 9 / 35
Wzorzec Reactor: diagram klas EventHandler: interfejs, konkretne handler'y sªu» do obsªugi zdarze«okre±lonego typu. S rejestrowane i wywoªywane kiedy pojawi si odpowiednie zdarzenie ( callbacks, handler==agent) Handle: uchwyt do ¹ródªa zdarzenia (np. gniazdo, widget, plik) ródªo diagramów: Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects by Schmidt et al., strona 159 9 / 35
1 Rejestrujemy EventHandler z uchwytem (handle), np. gniazdem 2 Reactor pobiera uchwyty od zarejestrowanych EventHandlers 3 Reactor uruchamia Selectora (EventDemux) i przekazuje uchwyty 4 Selector informuje Reactor gdy które± uchwyty gotowe (np. gniazda) 5 Reactor u»ywa otrzymany od Selecotra podzbiór uchwytów do wywoªania metod handle_event() w odpowiednich EventHadnler'ach 6 handle_event() wywoªuje odpowiedni usªug która mo»e odpowiedzie od razu klientowi maj c dost p do uchwytu 10 / 35
Wzorzec Reactor: model asynchroniczny Selector dziaªa na zasadzie 'event-loop': gdy nast pi zdarzenie uruchamiamy odpowiedniego EventHandler'a ródªo diagramu 11 / 35
Wzorzec Reactor: wiele implementacji Implementacje wzorca Reactor: 1 Skromna przykªadowa implementacja: http:// assorted.sourceforge.net/java-reactor/ 2 Staranna implementacja z dobrym opisem: http://jeewanthad.blogspot.com/2013/02/ reactor-pattern-explained-part-1.html 3 Reactor gotowiec we freameworku Spring https://spring.io/guides/gs/ messaging-reactor/ 12 / 35
Reactor w Spring // Domy±lny reactor Reactor reactor = R.create(); // Interesujemy si zdarzeniami, które maj w opisie String topic = "wakacje"; // Rejestrujemy typ zdarzenia w reactor reactor.on($(topic), new Consumer<Event<String() { public void call(event<string> ev) { service.handleevent(ev); //odpowiednia obsªuga }}); // Gdy si kiedy± pojawi, mo»na poinformowa reactor reactor.notify("wakacje", Event.wrap(znow beda wakacje)); 13 / 35
Reactor: podsumowanie 1 Korzy±ci: rozwi zanie efektywne, ªatwa obsªuga (w praktyce programista deniuje event handler'y, reszt robi biblioteki) 2 Wada: trudne do zdebugowania, np. mo»e nie by jasne dlaczego dany event handler byª u»yty i trudno powtórzy dokªadnie te same warunki 3 Inne, ogólniejsze rozwi zanie: system Akka Reactor vs. Akka - dyskusja http://stackoverflow.com/questions/ 16595393/akka-or-reactor 14 / 35
Typesafe Inc. Typesafe zaªo»yª w 2011 Martin Odersky (EPFL). Prowadzi nast puj ce projekty open-source: 1 Scala 2 Akka 3 Play framework 4 sbt build tool 5 Scala IDE for Eclipse 6... Firmy deklaruj ce u»ycie Scala/Akka/Play to m.in: Twitter, The Guardian, Netix, LinkedIn (warto przeczyta opis) 15 / 35
Scala 1 Š czy programowanie obiektowe i funkcjonalne (kod bardziej zwi zªy ni» w Java) 2 Dziaªa na JVM, mo»na ª czy z kodem Javy (wszystkie biblioteki, frameworki Java) 3 Aplikacje Akka i Play mog by w Java i w Scali 4 Chyba warto si uczy 16 / 35
Technology Radar: Search A-Z: Scala 17 / 35
Czym jest Akka? We think that writing correct concurrent and scalable applications is now too hard (...) Akka authors 1 Akka daje wysokopoziomow abstrakcja dla programowania wspóªbie»nego: system aktorów 2 Aktorzy porozumiewaj si wyª cznie za pomoc niezmiennych (ang. immutable) komunikatów 3 Akka uªatwia stworzenie bezpiecznego modelu asynchronicznego, sterowanego zdarzeniami 18 / 35
Czym jest Akka? 19 / 35
Przykªadowa aplikacja przybli»anie liczby pi Wzór Leibniz'a: Im wi cej wyrazów uwzgl dnimy tym lepsze przybli»enie. Zadanie ªatwo jest przyspieszy, mo»emy podzieli sumowanie na niezale»ne zadania, wykona je równolegle i poª czy wyniki W 1874 W. Shanks 707 cyfr, 15 lat liczenia, 180 ostatnich cyfr obliczyª bª dnie... W 2010, 2 10 15 cyfr, 23 dni na 1000 maszynach 20 / 35
PiSystem aktorzy i wiadomosci 21 / 35
Wiadomo±ci s niezmienne (ang. immutable) static class Calculate {} static class Work { private final int start; private final int nrofelements; } static class Result { private final double value; } static class PiApproximation { private final double pi; private final Duration duration; } 22 / 35
Akka aktorzy system hierarechiczny mvn compile exec:java -Dexec.mainClass="$package$.Pi" // Use of the ActorSystem will create top-level actor, // that can create child actors, that can create child actors... final ActorSystem system = ActorSystem.create("PiSystem final ActorRef myactor = system.actorof(props.create(master.class,"master")); class Master extends UntypedActor { @Override public void onreceive(object message) { //Actor's message handlers...} 23 / 35
Tworzenie aktorów na przykladzie Pi.java ActorSystem system = ActorSystem.create("PiSystem"); class Listener extends UntypedActor {... class Master extends UntypedActor {... class Worker extends UntypedActor {... //create the master - jaki to wzorzec GoF? ActorRef master = system.actorof(new Props( new UntypedActorFactory() { UntypedActor create() {return new Master(parametry);} //master tworzy workerów... workerrouter = this.getcontext().actorof( new Props(Worker.class).withRouter( new RoundRobinRouter(nrOfWorkers))); //...i wysyla im polecenia workerrouter.tell(new Work(start, nrofelements), getself()); 24 / 35
Aktor Router Router jest aktorem, który przekazuje nadchodz ce wiadomo±ci do swoich potomków w okre±lony sposób: RoundRobinRouter, RandomRouter, SmallestMailboxRoute int nrofinst = 5; ActorRef router = system.actorof( new Props(Child.class).withRouter(new RandomRouter(nrOfInst router.tell(message, getself()); 25 / 35
Komunikacja mi dzy aktorami Aktorzy komunikuj wysyªaj c wiadomo±ci (metoda tell()), które s umieszczane Mailbox odbiorcy class Master extends UntypedActor{... public void onreceive(object message) { if (message instanceof Calculate) for (int start = 0; start < nrofmessages; start++) workerrouter.tell(new Work(start,elements), getself()) else if (message instanceof Result) { Result result = (Result) message; pi += result.getvalue();...} else unhandled(message); 26 / 35
Podsumowuj c, co robimy? 1 Deniujemy klasy wiadomo±ci. Wiadomo±ci s niezmienne (immutable), wszystkie pola nal 2 Deniujemy klasy-aktorów (extends UntypdActor) i przesªaniamy onrecive(...), która okre±la akcje w zale»no±ci od rodzaju wiadomo±ci 3 Okre±lamy hierarchie aktorów (kto kogo tworzy) 4 Aktorzy komunikuj si wyª cznie poprzez wymian wiadomo±ci: tell() i OnRecive(...) (aktorzy raczej nie powinni miec innych publicznych metod Akka threadsafety) 27 / 35
Czym jest aktor? 1 Aktor to w istocie kontener, który zawiera: State, Behavior, Mailbox, Childrens, Supervisor Strategy 2 Z aktorem zwi zany jest Context, zwaierajacy referencje do innych aktorów ActorRef (sªu» ce do komunikacji mi dzy aktorami) 3 Aktor ma dost p do swojej referencji getself() i do rodzica i potomków getcontext().parent.tell() 4 Do komuniaktów doª czana jest referencja do nadawcy i mo»na j odczyta metod getsender() 28 / 35
Czym jest referencja do aktora? 29 / 35
Po co referencje do aktorów? 1. Aktor tworzy i nadzoruje swoich potomków (np. jak s wyj tki w potomku, okresla co robi ) 2. Aktor mo»e przekazywa zadania potomkom (np. podzieli zadanie na mniejsze zadania) 3. Remote Actors - aktorzy zdalni, dziaªaj cy na innej maszynie Address addr = new Address("akka", "remotesys","host",1234); ActorRef routerremote = system.actorof( new Props(Child.class).withRouter( new RemoteRouterConfig(new RandomRouter(5),addr) ) 30 / 35
Remote actors 31 / 35
Mailbox co o nim wiemy? ActorRef router = getcontext().actorof( Props.create(PrintlnActor.class).withRouter( new RoundRobinRouter(5))); for (int i = 1; i <= 10; i++) router.tell(i, getself());..> Received message '1' in actor b..> Received message '2' in actor c..> Received message '3' in actor d..> Received message '6' in actor b..> Received message '4' in actor e..> Received message '8' in actor d..> Received message '5' in actor f..> Received message '9' in actor e..> Received message '10' in actor f..> Received message '7' in actor c 32 / 35
Mailbox - kolejno± dostarczania A1 wysyªa M1, M2, M3 do A2 A3 wysyªa M4, M5, M6 do A2 Wiemy,»e: 1 je±li M1 b dzie dostarczone to dojdzie przed M2 i M3 2 je±li M2 b dzie dostarczone to dojdzie przed M3 3 je±li M4 b dzie dostarczone to dojdzie przed M5 i M6 4 je±li M5 b dzie dostarczone to dojdzie przedm6 5 kolejno± mi dzy M1, M2, M3 a M4, M5, M6 nieustalona Zasada nie jest przechodnia: 1 A1 wysyªa X do A2 2 A1 wysyªa Y do A3 3 A2 przesyªa X do A3 4 A3 mo»e otrzyma X i Y w dowolnej kolejno±ci 33 / 35
Mailbox - gwarancje dostarczenia Akka nie daje»adnych gwarancji,»e wysªana wiadomo± dojdzie do odbiorcy, w razie potrzeby programista musi o to zadba sam w wy»szej warstwie (re-and-forget). Dlaczego? Nie wiadomo, czy wystarcz sprawdzi,»e wiadomo± doszªa do serwera odbiorcy? doszªa do Mailbox odbiorcy? zostaªa odebrana przez odbiorc? zostaªa poprawnie przetworzona przez odbiorc? tell() preferowane, ale jest równie» ask(), które blokuje 34 / 35
Untyped Actors komunikacja synchroniczna (niezalecane) Timeout timeout = new Timeout(Duration.create(5, ''seconds'')); Future<Object> future = Patterns.ask(actor, msg, timeout); String result = (String) Await.result(future, timeout.duration()); 35 / 35