2013-09-05 15 views
9

Sto cercando di trovare l'approccio migliore per condividere lo stesso pool di connessioni tra gli attori che lavorano con i cluster worker. Ho la seguente struttura:Akka e ReactiveMongo

Maestro Attore -> Attori operaio (può essere fino a 100 o più) -> MongoDB

tra lavoratori e MongoDB che voglio mettere reactivemongo, ma non sono sicuro di come esattamente fornire la condivisione del pool di connessione tra tutti gli attori.

Secondo reactivemongo documentazione:

esempio Un MongoDriver gestisce un sistema di attore; una connessione gestisce un pool di connessioni. In generale, MongoDriver o creare un MongoConnection non vengono mai istanziati più di una volta. È possibile fornire un elenco di uno o più server; il driver indovina se si tratta di un server autonomo o una configurazione di set di repliche. Anche con un nodo di replica, il driver analizzerà altri nodi e li aggiungerà automaticamente.

Devo solo crearlo nell'attore principale e quindi raggruppare con ogni messaggio? Quindi, questo sarebbe in Master attore:

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

E poi passare il collegamento ad attori in un messaggio. O dovrei interrogare una connessione in ogni attore di lavoro e passare solo il driver in un messaggio?

Qualsiasi aiuto è molto apprezzato. Grazie.

risposta

14

Vorrei creare il driver e connection nell'attore principale. Quindi imposterei gli attori worker per prendere un'istanza di MongoConnection come argomento del costruttore in modo che ogni worker abbia un riferimento alla connessione (che è in realtà un proxy per un pool di connessioni). Quindi, in qualcosa come preStart, fare in modo che l'attore principale crei i lavoratori (che presumo vengano instradati) e fornisca la connessione come argomento. Un esempio molto semplificato potrebbe essere la seguente:

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 = { 
    ... 
    } 
} 

Questo codice non è esatto, ma almeno mostra i concetti di alto livello che ho descritto.

+0

Grazie per la risposta, questo sembra buono, farò un tentativo. –

6

La risposta di cmbaxter funziona fintanto che non è necessario creare un'istanza degli attori di lavoro in remoto. MongoConnection non è serializzabile.

Ho trovato questo articolo https://github.com/eigengo/akka-patterns/wiki/Configuration molto utile. L'idea di base è di implementare un tratto chiamato Configured, che è popolato dall'applicazione principale. Gli attori possono quindi utilizzare quel tratto per accedere a oggetti locali non serializzabili come MongoConnection.