2012-05-22 26 views
9

¿Cómo puedo comprobar si un actor remoto, para el que he obtenido un actorRef a través de actorFor, está vivo? Cualquier referencia a la documentación sería apreciada. Estoy usando Akka de Scala.Comprobando si Akka actor remoto está disponible

He visto referencias a los supervisores y al deathwatch, pero realmente no siento que mi caso de uso necesite tanta maquinaria pesada. Solo quiero que mi cliente compruebe si el maestro está usando una ruta conocida, y si se envía un mensaje presentándose. Si el maestro no está arriba, entonces debe esperar un poco y luego volver a intentarlo.

Actualización 2: Sugerencias: uso una prueba de ping-pong para ver si está activa. Entiendo que esto es algo así como

implicit val timeout = Timeout(5 seconds) 
val future = actor ? AreYouAlive 
try{ 
    Await.result(future, timeout.duration) 
}catch{ 
    case e:AskTimeoutException => println("It's not there: "+e) 
} 

Creo que he sentido confundida por la presencia de excepciones en los registros, que se mantienen en la actualidad. P.ej.

  • error: java.net.ConnectException: Conexión rechazada
  • error: java.nio.channels.ClosedChannelException: null

Tal vez esto es sólo cómo funciona y que hay que aceptar los errores/advertencia en los registros en lugar de tratar de protegerse contra ellos?

+0

¿Qué tal si simplemente envía el mensaje 'Ping' al actor (por supuesto, tiene que manejarlo) y espera a' Pong' durante un tiempo? –

+0

Buena pregunta, hemos agregado la actualización. – Pengin

+0

No, no debe esperar que las operaciones 'tell' /'! 'Arrojen una excepción porque el manejo del mensaje ocurre de forma asíncrona. En su lugar, debe enviar un 'Ping' y ** esperar ** para' Pong' durante un tiempo. En su actor remoto simplemente agregue: 'case _: Ping => remitente! Pong' y en local: 'remoteActor? Ping' –

Respuesta

7

Sólo envíe sus mensajes. Su máquina podría volverse inalcanzable al nanosegundo después de que haya enviado su mensaje de todos modos. SI no obtiene ninguna respuesta, lo más probable es que esté muerta. Hay un gran capítulo sobre esto en los documentos: http://doc.akka.io/docs/akka/2.0.1/general/message-send-semantics.html

+0

Gracias. Creo que lo entiendo ahora Simplemente confundido acerca de que todavía hay errores en el registro, pero quizás esto es normal (pregunta actualizada). – Pengin

+0

Sí, Akka registra todos los errores de red. Puede cablear su propio registrador para descartar aquellos si lo desea. –

+0

Viktor, realmente quiero registrar un controlador personalizado, por ejemplo, uno que devuelve el mensaje al remitente. Registrar grandes cantidades de basura pero no dejarme saber que hubo un error es un esquema difícil de apreciar. –

1

Nunca debe suponer que la red está disponible. Nuestro arquitecto aquí siempre dice que hay dos conceptos clave que entran en juego en el diseño de sistemas distribuidos.

Ellos son:

  • Tiempo de espera de reintento

mensajes deben 'tiempo de espera' si no lo hacen después de un periodo x de tiempo y luego se puede volver a intentar el mensaje. Con tiempo de espera no tiene que preocuparse por el error específico, solo que la respuesta al mensaje ha fallado. Para obtener altos niveles de disponibilidad, es posible que desee considerar el uso de herramientas como zookeeper para manejar el monitoreo de la disponibilidad/clustering. Vea la elección de líder aquí, por ejemplo: http://zookeeper.apache.org/doc/trunk/recipes.html

Cuestiones relacionadas