2011-01-31 14 views
11

Sto usando le classi MailboxProcessor per mantenere gli agenti separati che fanno le loro cose. Normalmente gli agenti possono comunicare tra loro nello stesso processo, ma voglio che gli agenti si parlino l'un l'altro quando sono su processi separati o persino su macchine diverse. Che tipo di meccanismo è il migliore per implementare la comunicazione tra loro? C'è qualche soluzione standard?Passaggio di messaggi tra MailboxProcessor remoto?

Si prega di notare che sto usando istanze di Ubuntu per eseguire gli agenti.

+7

Chi ha votato come "off-topic"? Se non capisci la domanda per favore non interferire con essa. –

+1

http://stackoverflow.com/questions/501656/f-mailbox-processor-on-distributed-systems può fornire alcune informazioni. –

+0

forse guarda le code di Windows Azure. È ciò che usano per consentire a macchine diverse (li chiamano ruoli di lavoro) di parlare tra loro. Quello che puoi fare è avere un agente su ogni macchina che ha il compito di comunicare con gli altri per richiedere lavoro, notificare il lavoro, ecc. – jlezard

risposta

3

Penso che avrete intenzione di scrivere le vostre routine per serializzare i messaggi, passarli attraverso i confini del processo e quindi inviarli dall'altra parte. Ciò richiederà anche un'implementazione di un sistema ID in cui ogni casella di posta elettronica dispone di un ID e i processi possono inviare messaggi agli ID anziché solo a Mailbox.Send. Questo non è facile, in quanto le caselle locali saranno in grado di accedere alla memoria locale, ma le caselle remote non lo faranno.

Vorrei guardare qualcosa come RPyC (http://rpyc.wikidot.com/) in quanto fornisce un protocollo un po 'come si sta cercando.

Fondamentalmente la risposta è "no", non c'è davvero un buon modo per farlo.

+0

sai come andrebbe in altre lingue che hanno agenti: Erlang, Scala e co? Grazie! – jlezard

+0

Bene, in Erlang, non hai memoria condivisa. Ogni "thread" è in realtà un processo separato. Quindi quando dici 'pid! "foo" 'pid è semplicemente un id di un processo a cui' "foo" 'viene inviato. Poiché non esiste memoria condivisa e i processi hanno già dei pid, il networking è semplice come creare un dizionario di mapping da pid a IP e passare i messaggi in base a tali informazioni. Il problema con questo metodo è che tutte le comunicazioni devono essere fatte tramite il passaggio di messaggi e attualmente anche una copia di memoria del messaggio. Per quanto riguarda le prestazioni, questo non è sempre il migliore. Non ho alcuna esperienza con Scala. –

+0

E dovrei dire, i processi di Erlang non sono processi OS, sono processi VM. Un processo di Erlang ha un sovraccarico di memoria di poche centinaia di byte. Un processo del sistema operativo ha un sovraccarico nell'intervallo multi-KB. –