Considerare il classico programma "Conteggio parole". Conta il numero di parole in tutti i file in qualche directory. Master riceve una directory e divide il lavoro tra gli attori Worker (ogni lavoratore lavora con un file). Si tratta di pseudo-codice:Modelli di pianificazione Akka
class WordCountWorker extends Actor {
def receive = {
case FileToCount(fileName:String) =>
val count = countWords(fileName)
sender ! WordCount(fileName, count)
}
}
class WordCountMaster extends Actor {
def receive = {
case StartCounting(docRoot) => // sending each file to worker
val workers = createWorkers()
fileNames = scanFiles(docRoot)
sendToWorkers(fileNames, workers)
case WordCount(fileName, count) => // aggregating results
...
}
}
Ma io voglio eseguire questo programma Word Count dal programma (ad esempio ogni 1 minuto), fornendo directory diverse per la scansione.
E Akka prevede bel modo per il messaggio di programmazione che passa:
system.scheduler.schedule(0.seconds, 1.minute, wordCountMaster , StartCounting(directoryName))
Ma il problema con sopra scheduler inizia quando scheduler invia un nuovo messaggio da barrare, ma il messaggio precedente non è ancora elaborato (ad esempio ho inviato un messaggio a scansione di una grande directory, e dopo 1 secondo ho inviato un altro messaggio per scansionare un'altra directory, quindi l'operazione di elaborazione della prima directory non è ancora completata). Di conseguenza, il mio WordCountMaster
riceverà i messaggi WordCount
da lavoratori che stanno elaborando diverse directory.
Come soluzione alternativa invece di pianificare l'invio di messaggi, posso pianificare l'esecuzione di un blocco di codice che creerà ogni volta nuovoWordCountMaster
. Cioè una directory = uno WordCountMaster
. Ma penso che sia inefficiente, e anch'io ho bisogno di fornire nomi univoci per WordCountMaster
per evitare InvalidActorNameException
.
Quindi la mia domanda è: dovrei creare nuovo WordCountMaster
per ogni spunta come ho menzionato nel precedente paragrafo? O ci sono idee/schemi migliori su come ridisegnare questo programma per supportare la pianificazione?
qualche aggiornamento: In caso di creare un attore Maestro per directory, ho alcuni problemi:
- problema con denominazione attori
InvalidActorNameException: Nome attore [WordCountMaster ] non è unico!
e
InvalidActorNameException: Nome attore [WordCountWorker] non è unico!
Posso risolvere questo problema solo non fornendo il nome dell'attore. Ma in questo caso i miei attori ricevono nomi generati automaticamente, come $a
, $b
ecc. Non va bene per me.
- problema con config:
voglio escludere la configurazione dei miei router per application.conf
. Cioè Voglio fornire la stessa configurazione per ogni router WordCountWorker
.Ma dal momento che io non sto controllando i nomi di attori non posso usare la configurazione di seguito, perché non so i nomi degli attori:
/wordCountWorker{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = word-counter-dispatcher
}
Puoi dire di più sul motivo per cui ricevere vecchi messaggi WordCount è un problema? – kybernetikos
@kybernetikos Se invio istantaneamente ai miei messaggi 'WordCountMaster' 2 con diverse directory:' StartCounting (directory_1) 'e' StartCounting (directory_2) ', quindi' WordCountMaster' riceverà risultati per diverse directory. Cioè questo messaggio conterrà file provenienti da diverse directory 'WordCount (fileName, count)' – MyTitle
sì, ma mi chiedo perché questo sia un problema. Non sei in grado di identificare la directory dal nome del file? – kybernetikos