<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AQuA.it &#187; RPC</title>
	<atom:link href="http://blog.aquait.info/category/arquitectura/rpc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aquait.info</link>
	<description>Blog técnico de AQuA.it</description>
	<lastBuildDate>Mon, 17 Oct 2011 12:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Java AppServer-03: Configuración y código</title>
		<link>http://blog.aquait.info/2009/10/180/</link>
		<comments>http://blog.aquait.info/2009/10/180/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 01:08:40 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[AppServer]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=180</guid>
		<description><![CDATA[Este es el último artículo de esta serie. En este voy a presentar como se configura el servidor y además voy a subir el código fuente. Estructura de directorios: aquait-appserver/ application/ db_connection_pool.config Configuración del módulo pool de conexiones a la base modules.config Configuración de los módulos services.config Configuración de los servicios messaging.config Configuración del módulo [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0in; font-weight: normal;">Este es el último artículo de esta serie. En este voy a presentar como se configura el servidor y además voy a subir el código fuente.</p>
<p style="margin-bottom: 0in; font-weight: normal;"><span id="more-180"></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">Estructura de directorios:</p>
<p style="margin-bottom: 0in;"><strong>aquait-appserver/</strong></p>
<ul>
<li><strong> application/</strong>
<ul>
<li>db_connection_pool.config	Configuración del módulo pool de conexiones a la base</li>
<li>modules.config		Configuración de los módulos</li>
<li>services.config 		Configuración de los servicios</li>
<li>messaging.config		Configuración del módulo de mensajería</li>
<li>security.config 		Configuración de seguridad</li>
</ul>
</li>
<li><strong> lib/</strong>
<ul>
<li>aquaitrt-bin_2009r1.jar	Runtime</li>
<li>mail.jar 			Servicio de mail</li>
</ul>
</li>
<li><strong> log/</strong></li>
<li>logging.config				Configuración de logging</li>
<li>server.config				Configuración del servidor</li>
<li>start.sh</li>
<li>stop.sh</li>
<li>start.cmd				       Scripts para iniciar y detener al servidor</li>
<li>start.sh</li>
<li>stop.cmd</li>
<li>stop.sh</li>
</ul>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;"><strong>logging.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.level = ALL </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.pattern = ./log/server.%u.txt </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.limit = 50000 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.count = 1 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.formatter = com.aquait.utils.logging.ServerFormatter </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.ConsoleHandler.level = INFO </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.ConsoleHandler.formatter = com.aquait.utils.logging.ServerFormatter </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Archivo que configura el logging. El servidor usa la API estándar de Java SE para logear. El archivo por defecto define dos handlers. El primero que genera archivos y el segundo logea a la consola. Por más detalles, ver http://java.sun.com/javase/6/docs/api/java/util/logging/package-summary.html.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>server.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Server config </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Server listening port </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">port = 6666 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Worker pool size </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">workers.poolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Shutdown password </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">shutdown.password = _shut_down_now_server_ </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo define tres parámetros del servidor. Primero el puerto TCP/IP en el cual el servidor escucha conexiones. Los clientes se deberán conectar a este puerto. El segundo parámetro define la cantidad de workers (hilos) que atienden los pedidos de los clientes. Y el tercero es la contraseña para bajar el servidor. Se baja mediante el script stop que se comunica al puerto definido y manda un mensaje especial. El servidor solamente se puede bajar desde el mismo host en donde está ejecutando.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>db_connection_pool.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># DBConnectionPoolModule configuration </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Examples: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#     url = jdbc:oracle:thin:@&lt;host&gt;:&lt;port&gt;:&lt;database&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#     driverclass = oracle.jdbc.driver.OracleDriver </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">enable = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">url = &lt;url&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">username = &lt;user&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">password = &lt;pass&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">driverclass = &lt;driver_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">autocommit = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">poolsize = 5 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">maxpoolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo controla los parámetros del pool de conexiones a la base de datos.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>modules.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Modules to load </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       module.name = &lt;module_name&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       module[&lt;module_name&gt;].class = &lt;module_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#</span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">En este archivo se delcaran los módulos que van a desplegarse en el servidor. Cada módulo puede tener una cantidad varible de parámetros.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>messaging.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># MessagingModule configuration </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">enable = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">poolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> # Security realms </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format (&lt;n&gt; starts at 0): </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       security_realm[&lt;n&gt;] = &lt;security_realm_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#</span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo configura la seguridad del servidor. Se pueden definir varios realms que se ejecutan en orden  para cada pedido de los clientes.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>services.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Services </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].interface = &lt;service_interface&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].implementation = &lt;service_implementation&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].parameter[&lt;param_name&gt;] = &lt;param_value&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo configura los servicios que se publican en el servidor. Para cada servicio hay que configurar la interfaz y la implementación de esta. Además, opcionalmente, se pueden agregar parámetros de inicialización.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Con esto finalizamos esta serie. Siempre estoy a las orden ante cualquier consulta que tengan al respecto de este servidor.</p>
<p style="margin-bottom: 0in; font-weight: normal;">Bajar código fuente: <a href="http://blog.aquait.info/wp-content/uploads/2009/10/aquaitrt_2009-10-14.tar.gz">aquaitrt_2009-10-14.tar.gz</a></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;title=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" id="wpa2a_2"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/10/180/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java RPC-07: Extras y rendimiento</title>
		<link>http://blog.aquait.info/2009/09/java-rpc-07-extras-y-rendimiento/</link>
		<comments>http://blog.aquait.info/2009/09/java-rpc-07-extras-y-rendimiento/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 01:07:39 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=104</guid>
		<description><![CDATA[En este es último artículo de la serie RPC voy explorar algunas extras que tiene el servidor que nos van a servir para implementar un servidor de aplicaciones, pero sin perder generalidad. También vamos ha realizar un test de rendimiento, viendo el througput (pedidos por segundo) que tiene el servidor. Extras Los servicios en el [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">En este es último artículo de la serie RPC voy explorar algunas extras que tiene el servidor que nos van a servir para implementar un servidor de aplicaciones, pero sin perder generalidad. También vamos ha realizar un test de rendimiento, viendo el througput (pedidos por segundo) que tiene el servidor.</p>
<p style="margin-bottom: 0in;"><span id="more-104"></span></p>
<p style="margin-bottom: 0in;">Extras</p>
<p style="margin-bottom: 0in;">Los servicios en el lado del servidor toman parámetros de inicialización. Esto nos va a permitir pasar datos al servicio para configurarlos. Estos parámetros se acceden mediante el método getParameters() de la clase Service, que devuelve un Mapa con la configuración.</p>
<p style="margin-bottom: 0in;">Validación de servicios</p>
<p style="margin-bottom: 0in;">Antes de agregar un servicio al servidor, se realizan los siguientes chequeos:</p>
<ul>
<li>
<p style="margin-bottom: 0in;">Que la 	implementación del servicio tiene que tener un constructor sin 	parámetros</p>
</li>
<li>
<p style="margin-bottom: 0in;">Que la implementación del 	servicio debe implementar la interfaz del servicio</p>
</li>
<li>
<p style="margin-bottom: 0in;">Qué no haya sobrecarga de métodos 	en el servicio</p>
</li>
<li>
<p style="margin-bottom: 0in;">Que el tipo de retorno como los 	parámetros de los métodos sean serializables</p>
</li>
</ul>
<p style="margin-bottom: 0in;">Estos chequeos ayudan a evitar errores comunes.</p>
<p style="margin-bottom: 0in;">Autorización de ejecución</p>
<p style="margin-bottom: 0in;">Antes de efectivamente ejecutar un método de un servicio, se invoca a un interceptor: onPreExecution. Si se ejecuta correctamente, entonces se pasa a invocar al servicio, si no se sale por excepción NotExecutedException. Esto nos va a servir para implementar, por ejemplo, mecanismos de seguridad y auditoría (logging).</p>
<p style="margin-bottom: 0in;">Rendimiento</p>
<p style="margin-bottom: 0in;">Con el test de rendimiento vamos comprobar ver si el diseño que hicimos es escalable como queríamos. El test se realizó en un notebook que tiene un CPU Intel modelo T9500 (C2D 2.6GHz, 6MB de cache core Penryn) con 2GB de RAM sobre Ubuntu 9.04 32 bits y con Java6. Los resultados fueron:</p>
<dl>
<dl>
<dd>
<table border="1" cellspacing="0" cellpadding="4" width="100%" bordercolor="#000000">
<col width="37"></col>
<col width="37"></col>
<tbody>
<tr valign="top">
<td width="9%" bgcolor="#000000"><span style="color: #ffffff;">Caso</span></td>
<td width="15%" bgcolor="#000000"><span style="color: #ffffff;">Procesos cliente</span></td>
<td width="16%" bgcolor="#000000"><span style="color: #ffffff;">Hilos por cliente</span></td>
<td width="14%" bgcolor="#000000"><span style="color: #ffffff;">Pedidos por hilo</span></td>
<td width="17%" bgcolor="#000000"><span style="color: #ffffff;">Total pedidos</span></td>
<td width="15%" bgcolor="#000000"><span style="color: #ffffff;">Tiempo (segs)</span></td>
<td width="15%" bgcolor="#000000"><span style="color: #ffffff;">Pedidos/ segundo</span></td>
</tr>
<tr valign="top">
<td width="9%">
<p align="right">1</p>
</td>
<td width="15%">
<p align="right">5</p>
</td>
<td width="16%">
<p align="right">30</p>
</td>
<td width="14%">
<p align="right">2500</p>
</td>
<td width="17%">
<p align="right">375000</p>
</td>
<td width="15%">
<p align="right">207</p>
</td>
<td width="15%">
<p align="right">1811,59</p>
</td>
</tr>
<tr valign="top">
<td width="9%">
<p align="right">2</p>
</td>
<td width="15%">
<p align="right">10</p>
</td>
<td width="16%">
<p align="right">30</p>
</td>
<td width="14%">
<p align="right">2500</p>
</td>
<td width="17%">
<p align="right">750000</p>
</td>
<td width="15%">
<p align="right">229</p>
</td>
<td width="15%">
<p align="right">3275,11</p>
</td>
</tr>
</tbody>
</table>
</dd>
</dl>
</dl>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Si bien no es un test de stress muy riguroso, nos da una buena aproximación de la performance y escalabilidad del servicio: aumentando al doble la cantidad de pedidos, solamente sube el tiempo en 10,6%. También, hay un valor que se puede ajustar en la creación del servidor que es el tamaño del pool de workers de la capa Pedido que despachan pedidos a la capa Servicio. Por defecto es de tamaño 10, pero si se está ante una configuración multi CPU se puede subir este valor para obtener mejor rendimiento. En el caso del test de rendimiento se utilizó un pool de 10 workers.</p>
<p style="margin-bottom: 0in;">Un servidor de aplicaciones basado en un versión más vieja de este mecanismo de RPC está implantado hace ya varios años en uno de los bancos más importantes de Uruguay.</p>
<p style="margin-bottom: 0in;">En el próximo artículo vamos a comenzar con la introducción al servidor de aplicaciones y cuales son los componentes principales.</p>
<p style="margin-bottom: 0in;">Stay tuned!</p>
<p style="margin-bottom: 0in;">
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-07-extras-y-rendimiento%2F&amp;linkname=Java%20RPC-07%3A%20Extras%20y%20rendimiento" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-07-extras-y-rendimiento%2F&amp;linkname=Java%20RPC-07%3A%20Extras%20y%20rendimiento" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-07-extras-y-rendimiento%2F&amp;linkname=Java%20RPC-07%3A%20Extras%20y%20rendimiento" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-07-extras-y-rendimiento%2F&amp;linkname=Java%20RPC-07%3A%20Extras%20y%20rendimiento" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-07-extras-y-rendimiento%2F&amp;title=Java%20RPC-07%3A%20Extras%20y%20rendimiento" id="wpa2a_4"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/09/java-rpc-07-extras-y-rendimiento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java RPC-06: Capa Servicio</title>
		<link>http://blog.aquait.info/2009/09/java-rpc-06-capa-servicio/</link>
		<comments>http://blog.aquait.info/2009/09/java-rpc-06-capa-servicio/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 17:37:06 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=79</guid>
		<description><![CDATA[En el artículo anterior vimos como estaba estructurada la capa Servicio y cuales eran las ideas principales. Pero para que sea realmente útil, nos quedaba responder las siguientes dos preguntas: ¿Cómo vamos a hacer para crear una instancia que sea un proxy de la clase MathServiceImpl, que implemente la interfaz MathService en forma automática y [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0in;">En el artículo anterior vimos como estaba estructurada la capa Servicio y cuales eran las ideas principales. Pero para que sea realmente útil, nos quedaba responder las siguientes dos preguntas:</p>
<ul>
<li>
<p style="margin-bottom: 0in;">¿Cómo vamos a hacer para crear 	una instancia que sea un proxy de la clase MathServiceImpl, que 	implemente la interfaz MathService en forma automática y en tiempo 	de ejecución?</p>
</li>
<li>
<p style="margin-bottom: 0in;">¿Cómo vamos a hacer un 	RequestListener genérico que “decodifique” el RequestPacket e 	invoque al método correcto de MathServiceImpl?</p>
</li>
</ul>
<p style="margin-bottom: 0in;"><span id="more-79"></span></p>
<p style="margin-bottom: 0in;">Primero la primera. Para poder ejecutar un método, necesitamos saber: qué método de qué servicio y con qué parámetros lo vamos a ejecutar y mandar esa información al servidor; para esto vamos a crear la clase ServicePacket, que contiene esta información (el nombre del servicio, el nombre del método y un array de Object con los parámetros que toma el método).</p>
<p style="margin-bottom: 0in;">Ahora necesitamos el proxy. Afortunadamente Java nos provee un mecanismo para crear proxies en tiempo de ejecución. Para ver la documentación sobre proxies dinámicos ver <a href="http://java.sun.com/javase/6/docs/technotes/guides/reflection/proxy.html">http://java.sun.com/javase/6/docs/technotes/guides/reflection/proxy.html</a>. Ahh! El poder de la reflexión <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="margin-bottom: 0in;">Entonces, lo que vamos a hacer es un InvocationHandler que arme el ServicePacket y con ayuda de la capa Pedido lo mande al servidor:</p>
<pre class="brush: java">public class ServiceInvocationHandler implements InvocationHandler {
    // implements InvocationHandler
    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
        RequestPacket req = new RequestPacket(new ServicePacket(serviceName, m.getName(), args), getUniqueKey());
        ResponsePacket result = requestManager.send(req);
        return result.getData();
    }
}</pre>
<p style="margin-bottom: 0in;">Vamos a tener una instancia de ServiceInvocationHandler por cada servicio y a cada servicio lo vamos a identificar con un String: serviceName.</p>
<p style="margin-bottom: 0in;">Para crear un proxy utilizaremos la clase ServiceProxyFactory que tiene el método createProxy() implementado según la guía sobre proxies dinámicos que va a crear por nosotros el ServiceInvocationHandler configurado. Y así obtenemos los proxies:</p>
<pre class="brush: java">MathService mathService = serviceProxyFactory.createProxy(“MathService”);</pre>
<p style="margin-bottom: 0in;">Luego la invocación:</p>
<pre class="brush: java">double pi = mathService.getPI();</pre>
<p style="margin-bottom: 0in;">No hay que crear ninguna clase extra ni nada por el estilo. Lo único que hay que hacer es pedirle a la serviceProxyFactory un proxy del servicio con el nombre del servicio deseado. Este nombre es el identificador con el que se registró el servicio en el servidor, por lo que es buena práctica ponerlo como constante en la interfaz del servicio.</p>
<p style="margin-bottom: 0in;">Obviamente hay más detalles de implementación, como que pasa con las excepciones en el servidor, pero no vale la pena adentrarnos en este punto ya que se puede ver claramente en la implementación de ServiceInvocationHandler.</p>
<p style="margin-bottom: 0in;">Ahora la segunda pregunta: ¿Cómo vamos a hacer un RequestListener genérico que “decodifique” el RequestPacket en invoque al método correcto de MathService?</p>
<p style="margin-bottom: 0in;">Simple, utilizando otra vez el poder de la reflexión. Vamos a explotar la capacidad de invocar métodos teniendo solamente el nombre y el nombre de la clase. Ahora es cuando vamos a “decodificar” RequestPacket, o mejor dicho, su payload: el ServicePacket. Con este payload, sabemos qué tenemos que ejecutar y con qué parámetros.</p>
<p style="margin-bottom: 0in;">Entonces, vamos a tener un componente RequestPacketListener para escuchar los pedidos de los clientes y con los datos en el ServicePacket podemos ejecutar el método requerido.</p>
<p style="margin-bottom: 0in;">Ahora un poco de UML:</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_82" class="wp-caption aligncenter" style="width: 636px"><img class="size-full wp-image-82" title="Java-RPC-06-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/09/Java-RPC-06-fig1.png" alt="Diseño de la capa Servicio" width="626" height="459" /><p class="wp-caption-text">Diseño de la capa Servicio</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">La clase ServiceManager implementa RequestPacketListener, por lo que acepta paquetes de la capa Pedido. Además contiene la colección de servicios registrados. Cuando llega un ServicePacket, con el nombre obtiene la instancia del servicio, con el nombre del método, obtiene el objeto método a ejecutar y con los parámetros (array de Object) lo ejecuta. La respuesta le envía al la capa Pedido en forma de ResponsePacket.</p>
<p style="margin-bottom: 0in;">Las clases RPCClient y RPCServer nos dan las funcionalidades para interactuar con el RPC de forma sencilla, encapsulando código “pegamento”.</p>
<p style="margin-bottom: 0in;">Entonces, un servicio se define:</p>
<p style="margin-bottom: 0in;">La declaración:</p>
<pre class="brush: java">public interface MathService extends client.service.Service {
    String SERVICE_NAME = “math_service”;
    double getPI();
}</pre>
<p style="margin-bottom: 0in;">La implementación:</p>
<pre class="brush: java">public class MathServiceImpl extends server.service.Service implements MathService {
    @Override
    public double getPI() {
        return 3.1416;
    }
}</pre>
<p style="margin-bottom: 0in;">Se registra en el main del servidor:</p>
<pre class="brush: java">RPCServer rpcServer = new RPCServer(12345); // port en donde escucha el servidor
rpcServer.getServiceManager().addService(
            MathService.SERVICE_NAME, // nombre
            MathtService.class,       // interfaz
            MathServiceImpl.class);   // implementación</pre>
<p style="margin-bottom: 0in;">Y se utiliza en el cliente:</p>
<pre class="brush: java">RPCClient rpcClient = new RPCClient(“localhost”, 12345); // host y port en donde está el servidor
MathServie mathService = (MathService)rpcClient.getService(MathService.SERVICE_NAME);
double pi = mathService.getPI();</pre>
<p style="margin-bottom: 0in;">Así queda el RPC implementado. En el siguiente artículo estaré posteando el código fuente y señalando algunas características extras que no fueron descritas para no agregar complejidad pues no están estrictamente relacionadas con el RPC.</p>
<p style="margin-bottom: 0in;">Next!</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-06-capa-servicio%2F&amp;linkname=Java%20RPC-06%3A%20Capa%20Servicio" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-06-capa-servicio%2F&amp;linkname=Java%20RPC-06%3A%20Capa%20Servicio" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-06-capa-servicio%2F&amp;linkname=Java%20RPC-06%3A%20Capa%20Servicio" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-06-capa-servicio%2F&amp;linkname=Java%20RPC-06%3A%20Capa%20Servicio" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F09%2Fjava-rpc-06-capa-servicio%2F&amp;title=Java%20RPC-06%3A%20Capa%20Servicio" id="wpa2a_6"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/09/java-rpc-06-capa-servicio/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java RPC-05: Capa Servicio</title>
		<link>http://blog.aquait.info/2009/08/java-rpc-05-capa-servicio/</link>
		<comments>http://blog.aquait.info/2009/08/java-rpc-05-capa-servicio/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 16:16:12 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=66</guid>
		<description><![CDATA[Ahora si, la capa final. Lo que tiene que hacer esta capa es dar una interfaz amigable con el desarrollador para agregar y consumir servicios. Vimos que la API que daba la capa Pedido no era mala, pero se puede mejorar; tanto que podemos hacer que se parezca mucho a una invocación local. Idealmente queremos [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0in;">Ahora si, la capa final. Lo que tiene que hacer esta capa es dar una interfaz amigable con el desarrollador para agregar y consumir servicios. Vimos que la API que daba la capa Pedido no era mala, pero se puede mejorar; tanto que podemos hacer que se parezca mucho a una invocación local. Idealmente queremos que tenga la misma sintaxis y semántica que en una llamada local.</p>
<p style="margin-bottom: 0in;"><span id="more-66"></span></p>
<p style="margin-bottom: 0in;">Lo primero que tenemos que hacer es ver como, desde el cliente, nos “enganchamos” al código del servidor. Esto lo vamos a hacer mediante un proxy. Un proxy no es otra cosa que un representante del servicio en el cliente. Entonces, las invocaciones que se hagan sobre el proxy van a terminar en servidor:</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_67" class="wp-caption aligncenter" style="width: 447px"><img class="size-full wp-image-67" title="Java-RPC-05-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-05-fig1.png" alt="Esquema de una llamada RPC" width="437" height="181" /><p class="wp-caption-text">Esquema de una llamada RPC</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">La idea es que este proxy utilice la capa Pedido: construyendo el RequestPacket, mandándolo con send() y devolviendo el ResponsePacket con la respuesta. Y en el servidor hay que tener un RequestPacketListener que “decodifique” el paquete y lo mande a ejecutar al método correcto de la implementación correcta.</p>
<p style="margin-bottom: 0in;">Entonces vamos a partir el servicio en dos: interfaz e implementación. La interfaz del servicio la usa el cliente:</p>
<pre class="brush: java">public interface MathService {
    double getPI();
}</pre>
<p style="margin-bottom: 0in;">Y su implementación está en el servidor:</p>
<pre class="brush: java">public class MathServiceImpl implements MathService {
    @Override
    public double getPI() {
        return 3.1416;
    }
}</pre>
<p style="margin-bottom: 0in;">El hecho de que MathServiceImpl implemente MathService, es por prolijidad, pero no es obligatorio.</p>
<p style="margin-bottom: 0in;">Ahora necesitamos una implementación del lado del cliente que utilice la capa Pedido:</p>
<pre class="brush: java">public class MathServiceProxy implements MathService {
    @Override
    public double getPI() {
        RequestPacket req = new RequestPacket(id, “obtener_valor_de_pi”);
        ResponsePacket resp = requestManager.send(req);
        return ((Double)resp.getData()).doubleValue();
    }
}</pre>
<p style="margin-bottom: 0in;">Y en el servidor:</p>
<pre class="brush: java">public class RemoteExecution implements RequestPacketListener {
    public ResponsePacket requestPacketArrived(RequestPacket requestPacket) {
        if (requestPacket.getPayload().equals(“obtener_valor_de_pi”)) {
            return new ResponsePacket(requestPacket.getKey(), mathServiceImpl.getPI());
        }
        return null;
    }
}</pre>
<p style="margin-bottom: 0in;">Para realizar la invocación desde el cliente:</p>
<pre class="brush: java">MathService mathService = new MathServiceProxy();
double pi = mathService.getPI();</pre>
<p style="margin-bottom: 0in;">Así invocamos desde el cliente, utilizando la interfaz, al servidor y obtenemos la respuesta. La capa Servicio nos va a dar todo esto (y más) automágicamente. Esto nos va a permitir que solamente tengamos que escribir la interfaz (MathService) y la implementación del servicio (MathServiceImpl).</p>
<p style="margin-bottom: 0in;">Las preguntas que quedan son:</p>
<ul>
<li>
<p style="margin-bottom: 0in;">En el cliente: ¿Cómo vamos a 	hacer para crear una instancia que sea un proxy de la clase 	MathServiceImpl, que implemente la interfaz MathService en forma 	automática y en tiempo de ejecución?</p>
</li>
<li>
<p style="margin-bottom: 0in;">En el servidor: ¿Cómo vamos a 	hacer un RequestListener genérico que “decodifique” el 	RequestPacket en invoque al método correcto de MathService?</p>
</li>
</ul>
<p style="margin-bottom: 0in;">Estas dos preguntas las vamos a responder en el próximo artículo <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-05-capa-servicio%2F&amp;linkname=Java%20RPC-05%3A%20Capa%20Servicio" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-05-capa-servicio%2F&amp;linkname=Java%20RPC-05%3A%20Capa%20Servicio" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-05-capa-servicio%2F&amp;linkname=Java%20RPC-05%3A%20Capa%20Servicio" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-05-capa-servicio%2F&amp;linkname=Java%20RPC-05%3A%20Capa%20Servicio" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-05-capa-servicio%2F&amp;title=Java%20RPC-05%3A%20Capa%20Servicio" id="wpa2a_8"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/08/java-rpc-05-capa-servicio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java RPC-04: Capa Pedido</title>
		<link>http://blog.aquait.info/2009/08/java-rpc-04-capa-pedido/</link>
		<comments>http://blog.aquait.info/2009/08/java-rpc-04-capa-pedido/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 19:57:51 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=56</guid>
		<description><![CDATA[Hoy examinaremos una de las capas más complejas del sistema, la capa Request. Comparando esta capa con las anteriores (Conexión y Sesión) que son básicamente pasa-mano, esta capa agrega buena parte de la complejidad del sistema. ¿Por qué? Porque es la encargada del manejo de pedidos y respuestas concurrentes entre los clientes y el servidor. [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Hoy examinaremos una de las capas más complejas del sistema, la capa Request. Comparando esta capa con las anteriores (Conexión y Sesión) que son básicamente pasa-mano, esta capa agrega buena parte de la complejidad del sistema. ¿Por qué? Porque es la encargada del manejo de pedidos y respuestas concurrentes entre los clientes y el servidor.</p>
<p style="margin-bottom: 0in;"><span id="more-56"></span></p>
<p style="margin-bottom: 0in;">En las decisiones tomadas en el diseño de esta capa primó la escalabilidad: capacidad del servidor de procesar gran cantidad de pedidos y conservando tiempos de respuestas bajos. (Aclaro que no se busca desarrollar el RPC con más rendimiento del mundo, me conformo con uno que sea útil para cargas medias. Habrá un artículo dedicado al rendimiento del sistema).</p>
<p style="margin-bottom: 0in;">Al diseñador!</p>
<p style="margin-bottom: 0in;">Primero vamos a analizar el lado del servidor. Lo que buscamos es la capacidad de recibir y procesar pedidos concurrentemente, y claro, enviar las respuestas correspondientes. Siguiendo con la filosofía de las capas inferiores, vamos a tener la interfaz RequestPacketListener para escuchar pedidos, RequestPacket y se van a responder con la clase ResponsePacket.</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_57" class="wp-caption aligncenter" style="width: 610px"><img class="size-full wp-image-57" title="Java-RPC-04-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-04-fig1.png" alt="Diseño de la capa Sesión" width="600" height="466" /><p class="wp-caption-text">Diseño de la capa Pedido, lado servidor</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">La clase principal es RequestManager. Al implementar SessionPacketListener tiene la capacidad de recibir los mensajes de la capa Session y procesarlos. “Procesarlos” significa notificar al RequestPacketListener asociado. Ahora, para que esto sea concurrente, nos vamos a valer de la clase ThreadPoolExectutor para despachar los pedidos. Este Executor tiene un pool de threads -workers- que serán los que en definitiva invocan a requestPacketArrived() del RequestPacketListener para notificar la llegada del pedido. Antes de iniciar el procesamiento, a estos workers se les setea el contexto, que es el Map&lt;String, Object&gt; de Session; esto se hace mediante la clase WorkerContext.</p>
<p style="margin-bottom: 0in;">Ahora el cliente. En principio esta capa del lado del cliente podría ser simplemente otro pasamano, pero como queremos que un mismo cliente pueda realizar varios pedidos concurrentemente, tenemos que dale un poco más de pienso. Además, vamos a implementar un send() sincrónico. Así, podemos escribir:</p>
<pre class="brush: java">ResponsePacket response = requestManager.send(request);</pre>
<p style="margin-bottom: 0in;">Entonces ya esto se está pareciendo cada vez más a un RPC.</p>
<p style="margin-bottom: 0in;">Pero, cómo hacer para que una operación que es naturalmente asíncrona  (el send de sockets), sea sincrónica? Simple, utilizando semáforos (¡busy-waiting está prohibido!). Por cada pedido se va a crear un semáforo (Future) sobre el cual vamos a esperar la respuesta luego de enviar el pedido al servidor. Cuando la respuestas llega se notifica y el atributo data está cargado. Como queremos que un mismo cliente pueda realizar varios pedidos concurrentemente, vamos a tener una colección de estos semáforos.</p>
<p style="margin-bottom: 0in;">El atributo key en las clases RequestPacket y ResponsePacket es para encontrar al destinatario de la respuesta.</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_59" class="wp-caption aligncenter" style="width: 565px"><img class="size-full wp-image-59" title="Java-RPC-04-fig2" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-04-fig21.png" alt="Diseño de la capa Pedido, lado cliente" width="555" height="407" /><p class="wp-caption-text">Diseño de la capa Pedido, lado cliente</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Bueno, ahora si, esto ya es un RPC: mediante el RequestManager, podemos realizar pedidos al servidor y esperar la respuesta. Mientras el cliente espera, el servidor procesa la respuesta con el RequestPacketListener.</p>
<p style="margin-bottom: 0in;">Entonces, para implementar un método remoto, tenemos que crear un RequestPacketListener que haga lo que necesitamos y desde el cliente, mandar el RequestPacket con el método send de la clase RequestManager:</p>
<pre class="brush: java">RequestPacket req = new RequestPacket(key, “obtener_valor_de_pi”);
ResponsePacket resp = requestManager.send(req);
double pi = (Double)resp.getData();</pre>
<p style="margin-bottom: 0in;">Y en el servidor:</p>
<pre class="brush: java">public class RemoteExecution implements RequestPacketListener {
    public ResponsePacket requestPacketArrived(RequestPacket requestPacket) {
        if (requestPacket.getPayload().equals(“obtener_valor_de_pi”)) {
            return new ResponsePacket(requestPacket.getKey(), 3.1416);
        }
        return null;
    }
}</pre>
<p><span style="font-family: Liberation Mono,monospace;"> </span>Si bien este mecanismo es válido, está lejos de lo que queríamos; que era tener la misma sintaxis que la invocación a métodos locales:</p>
<pre class="brush: java">double pi = mathService.getPI();</pre>
<p style="margin-bottom: 0in;">Y su implementación:</p>
<pre class="brush: java">public MathService {
    public double getPI() {
        return 3.1416;
    }
}</pre>
<p style="margin-bottom: 0in;">Si podemos lograr esto último, estamos en la situación que queríamos desde el principio. En el próximo artículo vamos a ver la capa Servicio que, entre otras cosas, nos va a resolver este problema.</p>
<p style="margin-bottom: 0in;">Hasta el próximo!</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-04-capa-pedido%2F&amp;linkname=Java%20RPC-04%3A%20Capa%20Pedido" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-04-capa-pedido%2F&amp;linkname=Java%20RPC-04%3A%20Capa%20Pedido" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-04-capa-pedido%2F&amp;linkname=Java%20RPC-04%3A%20Capa%20Pedido" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-04-capa-pedido%2F&amp;linkname=Java%20RPC-04%3A%20Capa%20Pedido" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Fjava-rpc-04-capa-pedido%2F&amp;title=Java%20RPC-04%3A%20Capa%20Pedido" id="wpa2a_10"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/08/java-rpc-04-capa-pedido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java RPC-03: Capa Sesión</title>
		<link>http://blog.aquait.info/2009/08/rpc-03-capa-sesion/</link>
		<comments>http://blog.aquait.info/2009/08/rpc-03-capa-sesion/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 03:45:41 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=44</guid>
		<description><![CDATA[Hoy veremos la capa Sesión. Como el nombre lo indica, la idea de esta capa es la de representar la sesión, tanto para el cliente como para el servidor. En el cliente va a haber una única sesión, mientras en el servidor van a existir una por cada cliente conectado. La principal responsabilidad de esta [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Hoy veremos la capa Sesión. Como el nombre lo indica, la idea de esta capa es la de representar la sesión, tanto para el cliente como para el servidor. En el cliente va a haber una única sesión, mientras en el servidor van a existir una por cada cliente conectado. La principal responsabilidad de esta capa es mantener el estado del cliente del lado del servidor.</p>
<p style="margin-bottom: 0in;"><span id="more-44"></span></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Esta capa es bastante sencilla está compuesta por tres clases y una interfaz. Al igual que en la capa conexión, hay clases que se comparten entre el cliente y el servidor y hay clases que solo se usan del lado del servidor, en realidad hay una sola que se usa exclusivamente del lado del servidor: la clase SessionManager.</p>
<p style="margin-bottom: 0in;">El diseño sigue la misma filosofía que el de la capa Conexión: tiene su propio paquete, se basa en el patron Observer para notificar la llegada de mensajes y tiene la primitiva send(p) para enviar mensajes.</p>
<div id="attachment_46" class="wp-caption aligncenter" style="width: 556px"><img class="size-full wp-image-46" title="Java-RPC-03-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-03-fig1.png" alt="Java-RPC-03-fig1" width="546" height="460" /><p class="wp-caption-text">Diseño de la capa Sesión</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">La clase Session es el centro del diseño; cada instancia va a escuchar por ConectionPacket a través de la Connection asociada y va a notificar al SessionPacketListener. Este es el funcionamiento tanto del lado del cliente como del lado del servidor para el envío y recepción de paquetes.</p>
<p style="margin-bottom: 0in;">Además, el servidor acepta conexiones mediante el SessionManager, ya que es un ConnectionListener. Cuando se acepta la conexión este crea la Session para esta nueva conexión.</p>
<p style="margin-bottom: 0in;">En el próximo artículo vamos a ver la capa Pedido, que tiene bastante jugo.</p>
<p style="margin-bottom: 0in;">Feliz nostalgia <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-03-capa-sesion%2F&amp;linkname=Java%20RPC-03%3A%20Capa%20Sesi%C3%B3n" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-03-capa-sesion%2F&amp;linkname=Java%20RPC-03%3A%20Capa%20Sesi%C3%B3n" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-03-capa-sesion%2F&amp;linkname=Java%20RPC-03%3A%20Capa%20Sesi%C3%B3n" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-03-capa-sesion%2F&amp;linkname=Java%20RPC-03%3A%20Capa%20Sesi%C3%B3n" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-03-capa-sesion%2F&amp;title=Java%20RPC-03%3A%20Capa%20Sesi%C3%B3n" id="wpa2a_12"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/08/rpc-03-capa-sesion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java RPC-02: Capa Conexión</title>
		<link>http://blog.aquait.info/2009/08/rpc-02-capa-conexion/</link>
		<comments>http://blog.aquait.info/2009/08/rpc-02-capa-conexion/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 03:32:32 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=36</guid>
		<description><![CDATA[En el artículo anterior, vimos la arquitectura del sistema; en este vamos a explorar la capa Conexión. Para comenzar, recordemos que la responsabilidad de esta capa es comunicar al cliente y al servidor mediante la red. La capa conexión que se va a implementar va a ser sobre TCP/IP, pero el diseño permite que se [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->En el artículo anterior, vimos la arquitectura del sistema; en este vamos a explorar la capa Conexión.</p>
<p style="margin-bottom: 0in;">Para comenzar, recordemos que la responsabilidad de esta capa es comunicar al cliente y al servidor mediante la red. La capa conexión que se va a implementar va a ser sobre TCP/IP, pero el diseño permite que se pueda implementar sobre otros protocolos.</p>
<p style="margin-bottom: 0in;"><span id="more-36"></span></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Acá va el diagrama de clases (en UML):</p>
<div id="attachment_37" class="wp-caption aligncenter" style="width: 600px"><img class="size-full wp-image-37" title="Java-RPC-02-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-02-fig1.png" alt="Java-RPC-02-fig1" width="590" height="300" /><p class="wp-caption-text">Diseño de la capa Conexión</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Como se puede ver, el diseño es bastante sencillo. El principal servicio de esta capa, lo provee la clase Conection con el método send(ConnectionPacket p). La clase ConnectionPacket, no es otra cosa que la unidad de trabajo de esta capa. En general, todas las capas van a tener su packet.</p>
<p style="margin-bottom: 0in;">Cuando un paquete llega a la clase Connection, esta notifica de la llegada del mismo mediante el evento connectionPacketArrived de la interfaz ConnectionPacketListener. Se da una suerte de patron Observer. Notar que la clase Connection es un Thread, así puede atender y autónomamente los paquetes que llegan.</p>
<p style="margin-bottom: 0in;">Acá presentamos el diagrama de secuencia para el envío y llegada de un paquete desde el cliente:</p>
<div id="attachment_39" class="wp-caption aligncenter" style="width: 432px"><img class="size-full wp-image-39" title="Java-RPC-02-fig2" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-02-fig2.png" alt="Java-RPC-02-fig2" width="422" height="247" /><p class="wp-caption-text">Envío y llegada de un mensaje</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">En el servidor ocurre algo similar, cuando llega un paquete a la clase Connection, se notifica al ConnectionPacketListener para que procese el mensaje. Si corresponde una respuesta, se enviará de la misma forma que en el cliente. La idea es que la clase Connection sea la misma tanto para el lado del cliente como para el lado del servidor.</p>
<div id="attachment_40" class="wp-caption aligncenter" style="width: 356px"><img class="size-full wp-image-40" title="Java-RPC-02-fig3" src="http://blog.aquait.info/wp-content/uploads/2009/08/Java-RPC-02-fig3.png" alt="Java-RPC-02-fig3" width="346" height="255" /><p class="wp-caption-text">Recepción de un mensaje en el servidor</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">El último caso que queda ver es qué sucede cuando una petición de conexión de un nuevo cliente. Acá es donde entran en juego la clase ServerConnection y la interfaz ConnectionListener.</p>
<p style="margin-bottom: 0in;">La clase ServerConnection es responsable de escuchar por conexiones y cuando llega una, notifica mediante el evento newConnection(Connection c) de la interfaz ConnectionListener. Entonces, cuando llega una nueva conexión al servidor, el implementador de newConnection va a crear una nueva Connection para atender al nuevo cliente.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">A grandes rasgos, esta es la capa Conexión. A la hora de implementar aparecen algunos detalles de sincronización de threads y manejo de sockets, pero nada del otro mundo.</p>
<p style="margin-bottom: 0in;">Es importante comprender el mecanismo del eventos ya que se utiliza en todas las capas del RPC.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">En el próximo artículo estaremos analizando la capa Sesión.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-02-capa-conexion%2F&amp;linkname=Java%20RPC-02%3A%20Capa%20Conexi%C3%B3n" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-02-capa-conexion%2F&amp;linkname=Java%20RPC-02%3A%20Capa%20Conexi%C3%B3n" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-02-capa-conexion%2F&amp;linkname=Java%20RPC-02%3A%20Capa%20Conexi%C3%B3n" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-02-capa-conexion%2F&amp;linkname=Java%20RPC-02%3A%20Capa%20Conexi%C3%B3n" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-02-capa-conexion%2F&amp;title=Java%20RPC-02%3A%20Capa%20Conexi%C3%B3n" id="wpa2a_14"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/08/rpc-02-capa-conexion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java RPC-01: Arquitectura</title>
		<link>http://blog.aquait.info/2009/08/rpc-01-arquitectura/</link>
		<comments>http://blog.aquait.info/2009/08/rpc-01-arquitectura/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 00:47:32 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[RPC]]></category>
		<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=25</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">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.</p>
<p style="margin-bottom: 0in;"><span id="more-25"></span></p>
<p style="margin-bottom: 0in;">Primero lo primero: arquitectura</p>
<p style="margin-bottom: 0in;">Algo importante en cualquier sistema medianamente complejo, es la arquitectura. Esta característica determinará lo flexible, extensible y mantenible del sistema.</p>
<p style="margin-bottom: 0in;">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.</p>
<p style="margin-bottom: 0in;">
<div id="attachment_26" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-26" title="RPC-01-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/08/RPC-01-fig1.png" alt="Arquitectura de capas" width="450" height="246" /><p class="wp-caption-text">Arquitectura de capas</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Responsabilidades de cada una de las capas:</p>
<ul>
<li>
<p style="margin-bottom: 0in;">La capa <span style="font-weight: normal;">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.</span></p>
</li>
<li>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">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.</span></p>
</li>
<li>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">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.</span></p>
</li>
<li>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">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.</span></p>
</li>
</ul>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">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.</span></p>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">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:</span></p>
<pre class="brush: java">double pi = mathService.getPi();</pre>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">Como se ve, no se distingue si se trata de una llamada local o una llamada remota. Este es el efecto que se busca.</span></p>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">En sucesivos artículos exploraré cada una de las capas, comenzando por la capa Conexión.</span></p>
<p style="margin-bottom: 0in;"><span style="font-weight: normal;">Hasta el próximo!</span></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-01-arquitectura%2F&amp;linkname=Java%20RPC-01%3A%20Arquitectura" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-01-arquitectura%2F&amp;linkname=Java%20RPC-01%3A%20Arquitectura" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-01-arquitectura%2F&amp;linkname=Java%20RPC-01%3A%20Arquitectura" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-01-arquitectura%2F&amp;linkname=Java%20RPC-01%3A%20Arquitectura" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F08%2Frpc-01-arquitectura%2F&amp;title=Java%20RPC-01%3A%20Arquitectura" id="wpa2a_16"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/08/rpc-01-arquitectura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

