2015-03-18 27 views
6

Używam funkcji akka.Net do opracowania architektury wtyczek, w której każda biblioteka dll zawierająca jedną lub więcej wtyczek jest ładowana do własnego AppDomain i inicjowany jest nowy system aktorów gotowy do odbierania wiadomości z "Hosta".Potrzebuję komunikować się z wieloma zdalnymi systemami aktorskimi

Zostałem odklejony, próbując uruchomić to z wieloma wtyczkami.

Więc config Host wygląda następująco:

akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 50003 
      hostname = localhost 
     } 
    } 
} 

A config Wtyczka wygląda następująco:

akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 50004 
      hostname = localhost 
    } 
} 

(istnieje wiele z nich)

Moje pytanie brzmi jak mogę dostać wiadomości od Hosta do wszystkich wtyczek?

+1

Czy mają zarejestrować się w hoście podczas uruchamiania i od hosta, z którego masz teraz listę? –

Odpowiedz

10

Najlepszą rekomendacją jest użycie Akka.Cluster. Oto dobrze udokumentowany przykład: https://github.com/petabridge/akkadotnet-code-samples/tree/master/Cluster.WebCrawler

Edytuj - usunięto sugestię dotyczącą używania portu dynamicznego. O wiele lepiej jest używać statycznych, więc ponowne uruchamianie węzłów może być obsługiwane poprawnie.

Każda konfiguracja wtyczki używa portu specyficznego dla wtyczki (akka.remote.helios.tcp.port = 1231), a następnie definiuje klastrowany router, który komunikuje się z systemami aktorów spełniającymi określone role.

/api/broadcaster { 
    router = broadcast-group 
    routees.paths = ["user/api"] 
    cluster { 
     enabled = on 
     max-nr-of-instances-per-node = 1 
     allow-local-routees = on 
     use-role = crawler 
    } 
} 

Ten router, rozmieszczone na ścieżce user/api/broadcaster na jakiś węzeł może komunikować (przez strategię Broadcast routingu) z dowolnego aktora rozmieszczone na ścieżce user/api na każdym węźle w klastrze z roli crawler bez konieczności wyszukać adresy IP , porty lub jakikolwiek z tych bzdur.

skonfigurować informacje grupowania węzła za pośrednictwem poniższej sekcji w config Akka.NET za:

cluster { 
    #manually populate other seed nodes here, i.e. "akka.tcp://[email protected]:4053" 
    seed-nodes = ["akka.tcp://[email protected]:4053"] 
    roles = [crawler] 
} 

nasienne węzły - musi być dobrze znana, zdefiniowane statycznie portu i adres IP. Przeczytaj artykuł, w którym znajdziesz wyjaśnienie, dlaczego jest to ważne.

Role - rozdzielane przecinkami ciągi określające możliwości tego konkretnego węzła. Są bardziej jak tagi. Możesz używać ich wewnątrz ruterów klastrowych (takich jak te, które pokazałem wcześniej), aby określić, z którymi typami węzłów chcesz się komunikować.

+0

Jak można obejść problemy z zaporą firewall z portami dynamicznymi? – Chris

+0

@ Chris tak, moja rada na temat używania portów dynamicznych tutaj powinna zostać poprawiona. Nie pasują one do Akka.Cluster z powodu różnych problemów, a firewall jest jednym z nich. – Aaronontheweb