Akka podstawy część 2 – Akka routing

No dobra, mniej więcej wiemy po co są aktorzy.

Pobawmy się teraz w implementację podstaw…

Cały kod jest oczywiście na github – https://github.com/najavie/akka-farma01

uruchomienie poprzez activator

Użyłem tak jak poprzednio tego samego template’a, aby nic mi nie przeszkadzało, wywaliłem wszystko i zacząłem pisać na nowo 🙂

Utworzyłem sobie klasę z aktorem…

Krowa… a co…

Krowa lubi jeść… i ma taką oto metodę. Dodałem ją do enuma dla uproszczenia kolejnych przykładów, z reguły stosuje się trochę bardziej zaawansowane obiekty 🙂

Dobra, definicja krowy jest… czas ją utworzyć…

Standardowo najpierw system aktorów…

teraz stwórzmy… krowę 🙂

I dajmy jej jeść… 🙂

na ekranie widzimy jak krowa sobie żuje trawkę… 🙂

Ale jedna krowa to trochę mało prawda? Jakbym chciał mieć całe pastwisko krów… 1000 na przykład 🙂 Czy da się poprosić akkę o pomoc?

Akka router

Router jak sama nazwa wskazuje routuje wiadomości. Słuszna jest tutaj analogia do routerów sieciowych. Każdy router ma podłączone końcówki – aktorów, którym router przekazuje wiadomości.

Routerów, a dokładniej strategii routingu mamy kilka rodzajów:

  • round-robin – router który przekazuje wiadomości po kolei
  • random – jak sama nazwa wskazuje – wiadomości przekazywane są do aktorów losowo
  • balancing – router stara się balansować obciążenie aktorów poprzez przekazywanie wiadomości do najmniej obciążonych aktorów. W tym wypadku aktorzy dzielą mailbox między sobą
  • smallest mailbox – router wysyła wiadomości do aktorów z najkrótszą kolejką w mailbox
  • broadcast – router wysyła wiadomość do WSZYSTKICH aktorów
  • scatter gather first  completed – podobne do broadcast, ale router odbiera wynik tylko od tego, który skończył pierwszy, reszta jest kasowana
  • tail chopping – ciekawy router – router wysyła wiadomość do losowego aktora, po chwili do kolejnego losowego itp do czasu aż otrzyma od któregoś odpowiedź. Pozostałe odpowiedzi są kasowane
  • consistent hashing – http://en.wikipedia.org/wiki/Consistent_hashing – specjalny typ routingu. Zbyt zaawansowany na tą część tutoriala, opiszę go w kolejnych wpisach.

No dobra… trochę ich jest. Których używać? Ano tych, które rozwiążą najlepiej nasz problem.

Na początek użyjmy najprostszego – round-robin

i już 🙂 mamy stworzonych 1000 krów (aktorów) podłączonych do routera!

jak widać, krowy to też aktor, więc możemy mu przekazywać wiadomości, a router już zajmie się przekazaniem tej wiadomości odpowiedniemu aktorowi…

bez niespodzianek, omnomnomnom…

A jakbym chciał nakarmić wszystkie krowy? To albo wysłać 1000 wiadomości bez gwarancji, że każda coś zrobi, albo użyć innego routera – broadcast jest najfajniejszy chyba ?

voila… 1000 krów nakarmione 🙂

Fajnie, ale czy nie oszukuję ? Czy faktycznie 1000 różnych wątków wykonało tą pracę? Jakoś to możemy sprawdzić chyba… Aby było można cokolwiek odczytać zmniejszę liczbę krów do 3 🙂

Dodatkowo zmieniłem w aktorze wiadomość na:

Czyli pokaże nam jakąś informację o sobie, wątek i omnomnomononom i pójdzie krowa spać na 1s.

trochę o metodzie path() – path to ścieżka do aktora. Można tak skonfigurować akka aby odwoływać się do aktorów za pomocą ścieżki. Na moim przykładzie mam mniej więcej tak:

akka://farma/user – farma to wiadomo – nasz system aktorow, user to domyślne miejsce dla naszych aktorów. $a to nazwa routera. Jak widać nie mają żadnej nazwy, można im je przyznać poprzez lekkie zmodyfikowanie inicjalizacji routera:

I teraz magicznie zamiast $a pojawi się nam nazwa.

Mała uwaga. Akka aby nie zarżnąć całego systemu ustala sobie domyślną ilość wątków jaka może być jednocześnie odpalona. Możemy to oczywiście zmienić, zmienić strategie przydzielania wątków i pierdyliard innych rzeczy, ale to opiszę w kolejnym wpisie.

Na sam koniec dodaję jeszcze jedną metodę. Aby wszystko nie chodziło w nieskończoność, muszę wyłączyć system aktorów…

Spróbujcie utworzyć sobie 1000 aktorów i przekazać im wiadomośc. Zobaczycie, że wątki będą się powtarzały.

Czy programowanie wielowątkowe może być proste? Okazuje się, że TAK 🙂

Za pomocą kilku linijek kodu udało mi się utworzyć bezpieczny asynchroniczny system, który wykonuje pracę na wielu wątkach, a przy odrobinie wysiłku i modyfikacji może pracować w chmurce na wielu maszynach! Programowanie jest proste…