2013-09-05 22 views
9

Próbuję znaleźć najlepsze podejście do dzielenia tej samej puli połączeń pomiędzy aktorami a pracownikami klastra. Mam następującą strukturę:Akka i ReactiveMongo

Mistrza aktora -> Aktorzy Worker (może wynosić do 100 lub więcej) -> MongoDB

między pracownikami i MongoDB chcę umieścić reactivemongo, jednak nie jestem pewien, jak dokładnie zapewnić dzielenie puli połączeń pomiędzy wszystkimi uczestnikami.

Według reactivemongo dokumentacji:

przykład MongoDriver zarządza system aktora; połączenie zarządza pulą połączeń. Ogólnie MongoDriver lub tworzenie MongoConnection nigdy nie są tworzone więcej niż jeden raz. Możesz podać listę jednego lub więcej serwerów; sterownik zgadnie, czy jest to samodzielny serwer, czy konfiguracja zestawu replik. Nawet z jednym węzłem repliki sterownik będzie sprawdzał inne węzły i dodawał je automatycznie.

Czy powinienem go po prostu utworzyć w programie Master, a następnie dołączyć do każdej wiadomości? Tak, to byłoby w Mistrzowskiej aktora:

val driver = new MongoDriver 
val connection = driver.connection(List("localhost")) 

A potem przekazać połączenie do aktorów w wiadomości. A może powinienem zapytać o połączenie z każdym Aktorem Pracy i przekazać tylko sterownik w wiadomości?

Każda pomoc jest bardzo cenna. Dzięki.

Odpowiedz

14

Utworzę driver i connection w głównym odtwarzaczu. Następnie ustawiłbym aktorów pracowniczych tak, aby wziął instancję MongoConnection jako argument konstruktora, tak aby każdy pracownik miał odwołanie do połączenia (które w rzeczywistości jest proxy do puli połączeń). Następnie, w czymś podobnym do preStart, niech główny aktor utworzy robotników (który, jak zakładam, jest routowany) i poda połączenie jako argument. Bardzo uproszczony przykład może wyglądać w następujący sposób:

class MongoMaster extends Actor{ 
    val driver = new MongoDriver 
    val connection = driver.connection(List("localhost")) 

    override def preStart = { 
    context.actorOf(Props(classOf[MongoWorker], connection).withRouter(FromConfig())) 
    } 

    def receive = { 
    //do whatever you need here 
    ... 
    } 
} 

class MongoWorker(conn:MongoConnection) extends Actor{ 
    def receive = { 
    ... 
    } 
} 

to kod nie jest dokładna, ale przynajmniej wykazuje wysoki poziom I koncepcje opisane.

+0

Dzięki za odpowiedź, wygląda dobrze, spróbuję. –

6

Odpowiedź cmbaxtera działa tak długo, jak długo nie trzeba zdalnie tworzyć aktorów pracowniczych. MongoConnection nie można serializować.

Bardzo mi pomógł ten artykuł https://github.com/eigengo/akka-patterns/wiki/Configuration. Podstawową ideą jest zaimplementowanie cechy o nazwie Configured, która jest zapełniana przez główną aplikację. Aktorzy mogą następnie użyć tej cechy, aby uzyskać dostęp do lokalnych, nie nadających się do serializacji obiektów, takich jak MongoConnection.