2011-06-09 17 views
8

He estado estudiando cómo podría desarrollar una arquitectura distribuida que implemente la solicitud/respuesta de protocolo utilizando el concepto de concurrencia a través de actores.¿Cuál es la mejor manera de implementar un protocolo de solicitud/respuesta utilizando akka y scala?

Llegué a la conclusión de que la mejor manera de hacerlo es creando un sistema de respuesta con manejo sincrónico de futuros/promesas, y poco después de la respuesta, dejando un canal abierto para recibir notificaciones.

Por lo tanto, una arquitectura que funcionaría exactamente como un mensaje de la bandeja de entrada.

Tiene algunos problemas.

Por lo tanto, tendría que mantener dos puntos finales (actores en las dos capas)?

El problema: El módulo de vista solicita que se procese un elemento en particular. Ella envía este comando para ser procesado a través de RemoteActor en el servidor de aplicaciones. Este servidor debe devolver inmediatamente la promesa de que le notificará cuando se procese el elemento. Después de esto, el módulo de vista estará esperando la notificación de finalización del procesamiento.

¿Cómo ves este problema?

Estoy usando Scala, Akka y Google Guice.

Creo que es un problema genérico que cualquiera puede hacer uso de sus soluciones. Disculpe si estoy lastimando los términos del sitio de stackoverflow.

Gracias de antemano

Respuesta

4

no quiero distraer la atención de cualquier buenas respuestas que puede conseguir en Akka, porque por desgracia no sé mucho acerca de Akka y se distribuye actores características, pero me gustaría pregunta si has considerado alguna alternativa.

Parece que básicamente necesita una biblioteca RPC asíncrona. Hay dos poderosas bibliotecas escritas en Scala que sé que pueden satisfacer sus requisitos: http://sna-projects.com/norbert/ y http://twitter.github.com/finagle/. Finagle ofrece algunos combinadores realmente potentes para expresar dependencias de cómputo asíncronas y registrar oyentes en futuros. Actualmente estoy manteniendo Norbert, que utilizamos en LinkedIn para algunos de nuestros sistemas distribuidos, como la búsqueda.

+0

Proyectos geniales, tendré que mirar a Norbert.Akka proporciona un reemplazo impresionante para algunas funciones de simultaneidad de Scala Core y bibliotecas para hacer networking. Finagle y Norbert son marcos integrales para construir servicios de red agrupados. Algún día, un tipo equivalente de proyecto puede surgir de Akka. Qué herramienta elegir depende del caso de uso. – dward

4
//On "server" node 
class SomeActor extends Actor { 
    def receive = { 
    case messageToRemoteActor => self reply_? TypeOfResponseMessage() 
    } 
} 

Actor.remote.register("myRemoteActor", actorOf[SomeActor]) 

//On "client" node 
val remoteActor = Actor.remote.actorFor("myRemoteActor", "hostnameOrIpOfNodeContainingTheActorAbove", port) 

val f: Future[TypeOfResponseMessage] = remoteActor !!! messageToRemoteActor 

f.onComplete(_.value.get match { 
    case Left(exception) => handle(exception) 
    case Right(result) => handle(result) 
}) 
+0

¿Cuál es la implementación predeterminada utilizada en el método de recepción en actor? – ricardogobbo

+0

Implementación predeterminada de qué? –

+0

Respondió mi pregunta cuando editaste tu respuesta. =) Gracias! Tengo un problema descrito en esta pregunta. Quizás podrías ayudarme. [StackOverflowError durante la serialización] (http://stackoverflow.com/questions/6416222/akka-stackoverflowerror-during-object-serialization) – ricardogobbo

1

¿Por qué no usar solo uno de los enchufes REQ-REP de 0MQ?

https://github.com/zcox/akka-zeromq-java

esa manera a resolver su problema inmediato y, al mismo tiempo, aprender de comenzar una arquitectura que le llevará un largo camino y es compatible con las comunicaciones con los clientes escritos en muchos idiomas.

Para un ejemplo de que esto podría conducir vistazo a http://blog.getintheloop.eu/2009/05/22/lift-amqp-with-rabbitmq-and-scala-tutorial-and-screencast/

en cuenta que estoy NO lo que sugiere que utilice AMQP hoy, ya que un corredor RabbitMQ pueden ser excesivos para su problema inmediato. Más bien, sugiero que invierta su tiempo en utilizar una arquitectura (generación de mensajes) que le pague dividendos a largo plazo.

+0

Consideré usar 0MQ en nuestros proyectos. Sería una gran solución para la comunicación entre módulos y plataformas de desarrollo. Pero como es una arquitectura interna de un módulo, creo que sería una pérdida de tiempo y recursos utilizar una tecnología amable. El equipo de Jonas Boner, creador de Akka, está trabajando en un proyecto llamado [TypeSafe] (http://typesafe.com/), que proporcionará una plataforma empresarial para la comunicación entre módulos. En este caso, creo que usar Scala y Akka parece más sabio para esta arquitectura. – ricardogobbo

Cuestiones relacionadas