2011-01-31 8 views
11

Estoy usando MailboxProcessor clases para mantener separados a los agentes que hacen lo suyo. Normalmente, los agentes pueden comunicarse entre sí en el mismo proceso, pero quiero que los agentes hablen entre ellos cuando están en procesos separados o incluso en máquinas diferentes. ¿Qué tipo de mecanismo es el mejor para implementar la comunicación entre ellos? ¿Hay alguna solución estándar?¿Pasar mensajes entre MailboxProcessors remotos?

Tenga en cuenta que estoy usando instancias de Ubuntu para ejecutar los agentes.

+7

¿Quién votó esto como 'fuera del tema'? Si no comprende la pregunta, no la interfiera. –

+1

http://stackoverflow.com/questions/501656/f-mailbox-processor-on-distributed-systems puede proporcionar alguna idea. –

+0

tal vez mirar las colas azules de windows. Es lo que usan para permitir que diferentes máquinas (que los llaman roles de trabajadores) hablen entre sí. Lo que puede hacer es tener un agente en cada máquina que esté a cargo de comunicarse con los demás para solicitar el trabajo, notificar que el trabajo está hecho, etc. – jlezard

Respuesta

3

Creo que vas a tener que escribir tus propias rutinas para serializar mensajes, pasarlos a través de los límites del proceso y luego enviarlos al otro lado. Esto también requerirá una implementación de un sistema de identificación donde cada buzón tiene una identificación y los procesos pueden enviar mensajes a las ID en lugar de solo a Mailbox.Send. Esto no es fácil, ya que las cajas locales podrán acceder a la memoria local, pero los buzones remotos no lo harán.

Me gustaría ver algo así como RPyC (http://rpyc.wikidot.com/) ya que proporciona un protocolo algo parecido a lo que está buscando.

Básicamente la respuesta es 'no', no hay realmente una buena manera de hacerlo.

+0

¿sabe cómo sería esto en otros idiomas que tienen agentes: Erlang, Scala y co? ¡Gracias! – jlezard

+0

Bueno, en Erlang, no tienes memoria compartida. Cada "hilo" es realmente un proceso separado. Entonces cuando dices 'pid! "foo" 'pid es simplemente una identificación de un proceso al que se envía' "foo" '. Como no hay memoria compartida, y los procesos ya tienen pids, la creación de redes es tan simple como crear un diccionario de asignaciones de IPP a IP y pasar mensajes basados ​​en esa información. El problema con este método es que toda la comunicación debe hacerse a través del envío de mensajes, y actualmente también implica una copia de la memoria del mensaje. En cuanto a rendimiento, esto no siempre es lo mejor. No tengo ninguna experiencia con Scala. –

+0

Y debo decir, los procesos de Erlang no son procesos de SO, son procesos de VM. Un proceso de Erlang tiene una sobrecarga de memoria de unos pocos cientos de bytes. Un proceso de SO tiene una sobrecarga en el rango multi KB. –

Cuestiones relacionadas