2015-06-04 14 views
7

mam sporo Apache Camel (routing/mediacji/silnika orchestation; lekki ESB) doświadczenie i jestem regały mój mózg próbuje zrozumieć różnicę między Akka:mechanizmy wiadomości Akka przykładem

  • dyspozytorów (Dispatcher , PinnedDispatcher, CallingThreadDispatcher)
  • Routery
  • Baseny
  • Grupy Autobusy
  • imprez

Zgodnie z docs:

Dyspozytorzy są:

... jest to, co sprawia, Akka Aktorzy „tick”, to jest silnik maszyny tak powiem.

Ale to tak naprawdę nie wyjaśnia, czym jest dyspozytor lub jaki jest związek z aktorem.

Routery są:

Wiadomości mogą być wysyłane za pośrednictwem routera, aby skutecznie wyprowadzić do przeznaczenia aktorów, znanych jako jego routees. Router może być używany wewnątrz lub na zewnątrz aktora i możesz samodzielnie zarządzać routingiem lub użyć autonomicznego odtwarzacza routera z możliwościami konfiguracji. Ale brzmi okropnie jak dyspozytor.

Baseny są:

[A typ] Router [że] tworzy routees jak dziecięcych aktorów i usuwa je z routera, czy zakończyć.

Grupy są:

[A typ] aktor [gdzie routees] są tworzone zewnętrznie do routera, a router wysyła wiadomości do określonej ścieżce przy użyciu wybór aktora, bez oglądania na zakończenie .

Autobusy imprez są:

... sposób, aby wysyłać wiadomości do grup podmiotów

To brzmi jak dyspozytorów i routery.

Więc moje główne obawy są:

  • Jaka jest różnica między dyspozytorzy, routery i autobusów zdarzeń, a kiedy użyć każdego?
  • Kiedy korzystać z basenu vs grupy?

Odpowiedz

15

A Dyspozytor to po prostu pula wątków. Akka używa dispatchera do wielu rzeczy (np. Zapisywanie wiadomości w prawej skrzynce pocztowej lub odbiór wiadomości od skrzynki pocztowej aktora i przetwarzanie jej). Za każdym razem, gdy jedna z tych czynności musi zostać wykonana, wątek z puli wątków jest wybierany i wykorzystywany do tego. Akka przychodzi domyślnie z default-dispatcher z konfiguracją, którą można znaleźć tutaj w reference.conf wyszukując pod numer default-dispatcher. Już używasz default-dispatcher, ale możesz zdefiniować inny moduł rozsyłający, aby mieć zarezerwowaną pulę wątków dla innych celów (na przykład dla wątków netty przy użyciu akka-remote lub akka-cluster).

A router w Akka to aktor, który używa pewnego rodzaju logiki routingu do kierowania wiadomości do listy odbiorców. Istnieje wiele rodzajów routerów w zależności od logiki: Broadcast, Balancing, RoundRobin ... wszystkie możesz znaleźć w dokumentach akka. Routerami routera może być pula lub grupa. Jednym z najpopularniejszych przypadków użycia ruterów jest skalowanie aplikacji w pionie, co oznacza maksymalizację wykorzystania całego procesora dostępnego w systemie (jednoczesne korzystanie z wielu wątków).

Pula pula oznacza, że ​​trasy są tworzone na żądanie dla danego typu. Na przykład możesz chcieć RandomPool z MyFancyActor z 3 wystąpieniami. Akka stworzy trzech aktorów: MyFancyActor i czwartego, który będzie faktycznym routerem. Za każdym razem, gdy aktor routera otrzyma wiadomość, przekaże wiadomość do jednego z aktorów 3 MyFancyActor. Pula zajmuje się ponownym uruchamianiem aktorów i obserwowaniem ich cyklu życia, aby upewnić się, że liczba uruchomionych wystąpień jest n.

Grupa grupa oznacza, że ​​trasy są tworzone przed zdefiniowaniem routera. Po zdefiniowaniu routera musisz przekazać listę twoich trasowanych aktorów, które wcześniej utworzyłeś. Grupa nie będzie monitorować cyklu życia twoich aktorów i będziesz musiał to zrobić samodzielnie.

Autobusy zdarzeń to kanały, na których można subskrybować określony typ wiadomości z aktorem. Jeśli pojawi się komunikat o tym konkretnym typie, aktor dostanie go. Jest to używane w przypadku niektórych wewnętrznych elementów programu Akka, takich jak subskrypcja DeadLetter s, gdy wiadomość nie może dotrzeć do miejsca docelowego lub zdarzeń dotyczących tworzenia klastra (w klastrze akka). Użyjesz tego, aby zdawać sobie sprawę z wydarzeń mających miejsce w twoim ActorSystem.

+0

Niesamowite odpowiedź, dzięki @hveiga (+1) - kilka followups bardzo szybko: (1) tak, że brzmi jak 'Dispatcher' jest jak * * router, ale używane wewnętrznie do wysyłania wiadomości i innych rzeczy gwintem niskopoziomowe w Akka i jako taki nigdy nie wyślę wiadomości bezpośrednio do dyspozytora, ** tak **? (2) Wygląda na to, że magistrala zdarzeń jest naprawdę jak cała skrzynka pocztowa dla całego systemu. Ale jeśli zasubskrybowałem, aby otrzymać parytetyczny typ wiadomości z autobusu, czy to zablokuje inne typy aktorów od otrzymania tej samej wiadomości? Dzięki jeszcze raz! – smeeb

+0

'Dispatchery są dla ciebie przezroczyste. Oni __dispatch__ wątków do wykonywania działań. Nie możesz wysyłać wiadomości do 'dispatchera '. Warto wspomnieć, że 'dispatcher' to ** nie ** aktor, podczas gdy' router' jest. Jeśli chodzi o magistralę zdarzeń, to możesz mieć rację, jeśli chodzi o definicję skrzynki pocztowej w całym systemie. Jednak nie znam wewnętrznych, ale naprawdę wątpię, że faceci z Akki zrobią coś blokującego. Zakładam, że to nie blokuje. Prawdopodobnie jest zaimplementowany jako 'Router', gdzie lista trasowników (subskrybentów) dla każdego typu wiadomości zmienia się w czasie. – hveiga