Java RPC-01: Arquitectura

agosto 18th, 2009 by Enrique Leave a reply »

Este es el primero de una serie de artículos en los cuales presentaré el diseño y desarrollo de un mecanismo RPC en Java. Este RPC va a ser multi-hilo del lado del servidor para que pueda atender varios pedidos a la vez; y también va a ser multi-hilo del lado del cliente para que pueda realizar varios pedidos a la vez al servidor.

Primero lo primero: arquitectura

Algo importante en cualquier sistema medianamente complejo, es la arquitectura. Esta característica determinará lo flexible, extensible y mantenible del sistema.

Siguiendo el principio de divide+conquista elaboraremos una arquitectura en capas (o stack de capas) tanto del lado del cliente como del lado del servidor. La idea es que cada capa se comunica “lógicamente” con su homóloga y “físicamente” con la capa inferior.

Arquitectura de capas

Arquitectura de capas

Responsabilidades de cada una de las capas:

  • La capa Conexión se encarga de mantener la conectividad entre el cliente y el servidor. Del lado del cliente se mantiene un socket con el servidor. Del lado del servidor, se mantienen todas las conexiones (sockets) con los clientes.

  • La capa Sesión se encarga de mantener los datos de la sesión. La razón de esta capa es que si hay un problema de comunicación, no se pierda la sesión y el cliente se pueda reconectar.

  • La capa Pedido se encarga del lado del cliente de gestionar los pedidos realizados por los servicios en forma concurrente. Del lado del servidor los pedidos se despachan, también concurrentemente, a los servicios servidor.

  • La capa servicio es la que usa el cliente para comunicarse con el servicio servidor. Cada servicio consta de dos partes: la interfaz que utiliza el cliente y la implementación que está en el servidor.

Así, un pedido generado en la capa Servicio del cliente pasa virtualmente a la capa Servicio del servidor y si corresponde una respuesta, recorrerá el camino inverso. De esta forma se logra la invocación remota.

Además, la idea es que no haya diferencia (a nivel sintáctico) entre una llama remota y una llamada local, así en el código del cliente:

double pi = mathService.getPi();

Como se ve, no se distingue si se trata de una llamada local o una llamada remota. Este es el efecto que se busca.

En sucesivos artículos exploraré cada una de las capas, comenzando por la capa Conexión.

Hasta el próximo!

Blogger PostDiggRedditGoogle ReaderShare
Advertisement

Deja un comentario

Spam protection by WP Captcha-Free