<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez : AjMessages</title><link>http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx</link><description>Tags: AjMessages</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Introducción a AjProcessor (Parte 1)</title><link>http://msmvps.com/blogs/lopez/archive/2009/04/23/introducing_2D00_ajprocessor_2D00_part_2D00_1.aspx</link><pubDate>Thu, 23 Apr 2009 07:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1690196</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1690196</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/04/23/introducing_2D00_ajprocessor_2D00_part_2D00_1.aspx#comments</comments><description>&lt;p&gt;En marzo, estuve trabajando en el c&amp;oacute;digo de AjProcessor, parte de mi proyecto de Code Kata en Google:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La idea es la evoluci&amp;oacute;n de c&amp;oacute;digo experimental que hice con &lt;a target="_blank" href="http://ajlopez.wordpress.com/category/ajmessages/"&gt;AjMessages&lt;/a&gt; y otros ejemplos. Quiero tener una aplicaci&amp;oacute;n, basada en el pasaje de mensajes, que pueda ejecutar en una grilla de m&amp;aacute;quinas heterog&amp;eacute;neas. La aplicaci&amp;oacute;n podr&amp;iacute;a ser dividida en pasos, y cada paso podr&amp;iacute;a ejecutar en la misma m&amp;aacute;quina, para prueba local, o en distintas m&amp;aacute;quinas. El despliegue de la aplicaci&amp;oacute;n en distintas m&amp;aacute;quinas deber&amp;iacute;a ser transparente a la escritura del c&amp;oacute;digo de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Alguno de esos objetivos fueron alcanzados con AjMessages, pero esta vez, quiero partir de una base m&amp;aacute;s limpia, basada en las lecciones aprendidas en los anteriores intentos.&lt;/p&gt;
&lt;p&gt;Primero, quiero pasar en limpio algunas ideas b&amp;aacute;sicas, para explicar la motivaci&amp;oacute;n del c&amp;oacute;digo que est&amp;aacute; apareciendo en el proyecto. La idea b&amp;aacute;sica es tener lo que llamo processors, procesadores, c&amp;oacute;digo que recibe un mensaje y lo procesa.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El mensaje tiene un payload, contenido, que puede ser un objeto arbitrario, un string, o cualquier otra cosa, y propiedades adicionales, en forma de pares clave/valor.&lt;/p&gt;
&lt;p&gt;Otro ladrillo esencial en esta aplicaci&amp;oacute;n tipo lego, es el elemento que publica mensajes. Hay entonces un publisher:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor02.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El mensaje saliente puede ser recibido por cualquier otro c&amp;oacute;digo. El mismo mensaje puede ser procesado por m&amp;aacute;s de otro Processor:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor03.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Es como el patr&amp;oacute;n publish/subscribe. Otro patr&amp;oacute;n a tomar en cuenta, es un componente tipo router. Dependiendo de algo del mensaje (propiedad, contenido), o del entorno (balanceo de carga), env&amp;iacute;a el mensaje a diferentes destinos.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor04.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Muchas veces, un componente implementar&amp;aacute; ambos roles, de de Message Processor y el de Message Publisher. Para facilitar la llamada a objetos .NET comunes, ser&amp;iacute;a bueno tener un procesador que reciba un mensaje, toma una parte del mismo (por ejemplo, el contenido), y lo env&amp;iacute;a como par&amp;aacute;metro a un m&amp;eacute;todo del objeto .NET. El valor de retorno podr&amp;iacute;a ser tomado como contenido de un nuevo mensaje saliente.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor05.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Los componentes pueden ser dispuestos en cadena, implementando una especie de pipeline/tuber&amp;iacute;a donde procesar un mensaje:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor06.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Una disposici&amp;oacute;n m&amp;aacute;s compleja ser&amp;iacute;a recibir un mensaje, y reenviarlo a diferentes pipelines, seg&amp;uacute;n el contenido o propiedad del mensaje entrante. Y tomar los mensajes salientes de los pipelines, para reenviarlos al pr&amp;oacute;ximo paso.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor07.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;(este concepto podr&amp;iacute;a ser mapeado al concepto de Application en AjMessages, pero sin la idea de procesacimiento distribuido). Una idea m&amp;aacute;s interesante es ejecutar una especie de ruteadores a pipelines, pero en varias m&amp;aacute;quinas&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor08.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La infraestructura de AjProcessor estar&amp;iacute;a a cargo de la serializaci&amp;oacute;n, deserializaci&amp;oacute;n y ruteo de mensajes entre distintas m&amp;aacute;quinas anfitrionas. Podr&amp;iacute;a enviar mensajes usando Windows Communication Foundation (WCF), o cualquier otra tecnolog&amp;iacute;a. La idea es tener un trasporte que se pueda agregar o definir, en configuraci&amp;oacute;n, sin afectar al funcionamiento de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Bien, todas estas son las ideas iniciales que forman el fundameto el proyecto. En un pr&amp;oacute;ximo espero explicar algo del c&amp;oacute;digo actual (apenas algunas interfaces, clases de implementaci&amp;oacute;n y tests).&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1690196" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category></item><item><title>Web Crawler distribuido usando AjMessages</title><link>http://msmvps.com/blogs/lopez/archive/2009/03/10/web-crawler-distribuido-usando-ajmessages.aspx</link><pubDate>Tue, 10 Mar 2009 01:07:04 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1677100</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1677100</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/03/10/web-crawler-distribuido-usando-ajmessages.aspx#comments</comments><description>&lt;p&gt;En Enero pasado, actualicé mi proyecto AjMessages para que soporte comunicación usando DSS/CCR&amp;nbsp;y Windows Communication Foundation. AjMessage puede ejecutarse de forma distribuida, enviando mensajes desde un nodo lógico a otro. Los nodos lógicos pueden albergarse en una o más máquinas física. Más información sobre AjMessages en:&lt;/p&gt; &lt;p&gt;&lt;a title="AjMessages- a message processor" href="http://ajlopez.wordpress.com/2007/10/18/ajmessages-a-message-processor/"&gt;AjMessages- a message processor&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ajlopez.wordpress.com/2008/10/08/distributed-applications-with-ajmessages-using-dssccr/" target="_blank"&gt;Distributed Applications with AjMessages using DSS/CCR&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/10/aplicaciones-distribuidas-con-ajmessages-usando-dss-ccr.aspx" target="_blank"&gt;Aplicaciones Distribuidas con AjMessages usando DSS/CCR&lt;/a&gt;&lt;br /&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pueden descargar el código fuente desde&lt;/p&gt; &lt;p&gt;&lt;a title="ajmessages" href="http://www.codeplex.com/ajmessages"&gt;http://www.codeplex.com/ajmessages&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Tenía la idea de escribir un procesador de mensajes distribuidos. Hace unos años, escribí mi primer intento, llamado AjServer&lt;/p&gt; &lt;p&gt;&lt;a title="Hacia el AjServer" href="http://msmvps.com/blogs/lopez/archive/2006/07/20/105318.aspx"&gt;Hacia el AjServer&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Luego, encontré al proyecto &lt;a title="Fabriq" href="http://ajlopez.wordpress.com/2007/10/14/remember-fabriq/"&gt;Fabriq&lt;/a&gt;, estudiando sus ideas e implementación. En ese proyecto,&amp;nbsp;hay manejadores (handlers) lógicos de mensajes, que pueden instalarse de modo distribuido, de forma transparente, cambiando la información de configuración:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fabriq01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;En el&amp;nbsp;2007, escribí la primera versión de AjMessages, como prueba de concepto: pude reproducir bastante de las ideas de Fabriq, y a la vez, elevar el nivel de abstracción de algunos puntos, para conseguir mayor flexibilidad. Fabriq estaba más orientado a SOA. AjMessages se orienta a mensajes arbitrarios, que coordinados, pueden funcionar en una aplicación en grilla.&lt;/p&gt; &lt;p&gt;La solución actual de AjMessages es:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/AjMessages01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Hay un proyecto núcleo, y dos proyectos de transporte: uno para soporte de WCF, y otro que se basa en DSS/CCR (tecnologías de Microsoft Robotics). Si no tienen DSS/CCR instalado, pueden remover los proyectos que lo referencia. El núcleo de AjMessages está lib de dependencias de esas tecnologías.&lt;/p&gt; &lt;p&gt;AjMessages.SampleApp contiene un simple manejador de mensajes: un decrementador de enteros, que toma un mensaje de entrada, con un contenido entero, lo decrementa, y produce un nuevo mensaje.&lt;/p&gt; &lt;p&gt;En cambio,&amp;nbsp;AjMessages.WebCrawler implementa&amp;nbsp;el mensaje y manejadores de mensajes para armar un web crawler distribuido. Pueden ejecutarlo desde una sola máquina, o en varias.&lt;/p&gt; &lt;p&gt;Cara AjMessages tiene:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Body&lt;/strong&gt;: un contenido arbitrario&lt;br /&gt;&lt;strong&gt;Headers&lt;/strong&gt;: información adicional, por clave/valor.&lt;br /&gt;&lt;strong&gt;Action&lt;/strong&gt;: describe el destino del mensaje, usando un patrón Aplicación/Nodo/Acción&lt;/p&gt; &lt;p&gt;(más detalle en &lt;a title="AjMessages- a message processor" href="http://ajlopez.wordpress.com/2007/10/18/ajmessages-a-message-processor/"&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt;&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;Exploremos el ejemplo de web crawler. Esta aplicación está compuesta de nodos, que pueden ser orquestado para visitar una página web, tomar de esa página todos los enlaces relacionados, y volver a tomar esas páginas. Para que no sea un proceso infinito, la visita de páginas se limita al sitio inicial, y hasta un nivel de profundidad. La aplicación puede ser descripta lógicamente con este diagrama:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/webcrawler01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El primer mensaje se envía al nodo Controller, a su acción Dispatch. Ese primer mensaje contiene la dirección de la página a visitar. El mensaje es enriquecido, y pasado al nodo Controller, acción Resolve. Este nodo está a cargo de mantener la lista de páginas ya visitadas, y de controlar la profundidad de exploración. Si el enlace recibido es aprobado, entonces el mensaje es enviado al nodo Downloader, acción Download. El contenido de la página es recuperado, agregado al mensaje, y reenviado al nodo Harvester, a su acción&amp;nbsp;Harvest. Esta acción analiza el contenido de la página, y emite&amp;nbsp;varios mensajes, uno por&amp;nbsp;cada enlace encontrado. El receptor de esos nuevos enlaces es el nodo Resolver, en su acción Resolve. Así, el proceso continua hasta visitar todas las páginas (con un límite en la profundidad a explorar).&lt;/p&gt; &lt;p&gt;Esta aplicación se puede describir en un archivo de configuración XML, como por ejemplo:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a3a0de01-755f-4538-96e5-153042196cee" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Dispatcher&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DispatcherHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.WebCrawler.Handlers.Dispatcher, AjMessages.WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Dispatch&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DispatcherHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Harvester&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;HarvesterHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.WebCrawler.Handlers.Harvester, AjMessages.WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Harvest&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;HarvesterHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Downloader&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DownloaderHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.WebCrawler.Handlers.Downloader, AjMessages.WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Download&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DownloaderHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Controller&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ResolverHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.WebCrawler.Handlers.Resolver, AjMessages.WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Resolve&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ResolverHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Un aplicación, entonces, está compuesta de nodos lógicos. Cada nodo puede ser visto como una clase lógica. Cada nodo puede manejar acciones, que son los puntos destinos de los mensajes. Una acción puede&amp;nbsp;estar compuesta de uno o varios pasos. Este es el punto de extensibilidad de la aplicación: deben proveer los pasos, el manejador de mensaje, y escribir el archivo de configuración que orquestre el procesamiento de los mensajes.&lt;/p&gt;
&lt;p&gt;Pero una cosa es la aplicación, y otra es su distribución en máquinas físicas. Pueden tener dos hosts, e instalar diferentes nodes en cada uno:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/webcrawler02.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;En este diagrama, el Dispatcher y el Resolver están en un hosts, mientras que el Downloader y el Harvester están en otro. Pero Uds. pueden poner Harverstes en cada hosts,&amp;nbsp;o en veinte máquinas.&amp;nbsp;Queda en&amp;nbsp;Uds. cómo distribuir la carga del trabajo. Cuando un mensaje&amp;nbsp;es enviado&amp;nbsp;a un destino (Aplicación/Nodo/Acción),&amp;nbsp; AjMessage lo reenvía a un host apropiado, que contenga un nodo capaz de procesar el mensaje.&lt;/p&gt;
&lt;p&gt;La distribución de nodos lógicos en un host físico se define via configuración, por ejemplo:&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:17c1d13e-1e21-4d39-a87d-3e3a2b0a07a4" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Server1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;http://localhost:50002/AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Activate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Controller&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Dispatcher&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Harvester&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Downloader&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Server2&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;http://localhost:50003/AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;WebCrawler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Dispatcher&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Harvester&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Downloader&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Ejecutando el ejemplo Web Crawler&lt;/h3&gt;
&lt;p&gt;Pueden probar el programa, lanzando dos hosts, en la misma máquina. Hay que ejecutar el programa de consola AjMessage.Console. Al comenzar esta aplicación, podemos ingresar el comando&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;fork&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Este comando lanza un segundo host. Ahora, podemos configurar los dos hosts. En el primero, ingresamos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationServer1.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Este archivo carga la aplicación AjMessage inicial (es una aplicación más dentro de &amp;quot;la grilla&amp;quot;), y define un endpoint WCF para escuchar mensajes de otros posibles hosts. Ahora, en la misma consola, ingresamos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationWebCrawler.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Este comando carga la definición de la aplicación Web Crawler, con sus nodos lógicos (no hay información de deploy todavía). El tercer comando, define la distribución física de hosts:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationWebCrawlerNode1.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Ahora, volvamos a la segunda consola. Ahí, ingresamos los comandos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationServer2.xml&lt;br /&gt;load ConfigurationWebCrawler.xml&lt;br /&gt;load ConfigurationWebCrawlerNode2.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Estamos listos para lanzar el primer web crawling. Vamos a la primera consola, e ingresamos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;send WebCrawler/Dispatcher/Dispatch &lt;/font&gt;&lt;a href="http://ajlopez.zoomblog.com"&gt;&lt;font face="Consolas"&gt;http://ajlopez.zoomblog.com&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El programa comienza a trabajar, en AMBAS consolas. Una típica salida de la primera consola:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/webcrawler03.png" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Debería arreglar algunos problemas en el transporte DSS/CCR (actualmente, puede ejecutar una aplicación simple como el decrementador de enteros, pero no con el web crawler). Dos puntos para implementar:&lt;/p&gt;
&lt;p&gt;- Configuración remota de nodos&lt;br /&gt;- Distribución de los manejadores de mensajes (sus&amp;nbsp;.dlls)&amp;nbsp;a los nodos&amp;nbsp;remotos&lt;br /&gt;- Una configuración para todos los nodos (ahora, cada nodo es configurado separadamente)&lt;/p&gt;
&lt;p&gt;Comencé un experimento con un proceso más abstracto de mensajes, que quisiera que pudiera implementar casos de uso como:&lt;/p&gt;
&lt;p&gt;- Un simple hello world&lt;br /&gt;- El ejemplo de decrementar enteros&lt;br /&gt;- Web crawler distribuido&lt;br /&gt;- Una especie de Enterprise Service Bus&lt;/p&gt;
&lt;p&gt;Pueden ver mis primeros pasos en:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor" href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Todavía en desarrollo.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1677100" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx">Concurrency and Coordination Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx">Decentralized Software Services</category></item><item><title>Seminario gratuito: Programación Paralela, Programación Distribuida, High Performance Computing</title><link>http://msmvps.com/blogs/lopez/archive/2008/12/29/seminario-gratuito-programaci-243-n-paralela-programaci-243-n-distribuida-high-performance-computing.aspx</link><pubDate>Mon, 29 Dec 2008 08:12:32 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1657959</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1657959</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/12/29/seminario-gratuito-programaci-243-n-paralela-programaci-243-n-distribuida-high-performance-computing.aspx#comments</comments><description>&lt;p&gt;Desde fines del 2006, estoy trabajando con programación distribuida, usando &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx" target="_blank"&gt;CCR&lt;/a&gt;/&lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx" target="_blank"&gt;DSS&lt;/a&gt;, &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Windows+Communication+Foundation/default.aspx" target="_blank"&gt;WCF&lt;/a&gt; y otras tecnologías, como Message Passing Interface. En estas últimas semanas, comencé a trabajar con &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx" target="_blank"&gt;High Performance Computing&lt;/a&gt; Windows HPC Server 2008.&lt;/p&gt; &lt;p&gt;Ahora, en Enero, daremos con &lt;a href="http://blogs.southworks.net/srenzi/"&gt;Sebastián Renzi&lt;/a&gt; &lt;img height="73" alt="" src="http://s3.amazonaws.com/twitter_production/profile_images/58756450/DSC05500xxxx_bigger.jpg" width="73" /&gt;&amp;nbsp;(&lt;a href="http://twitter.com/sebarenzi"&gt;@SebaRenzi&lt;/a&gt;) un seminario gratuito en el &lt;a href="http://www.mug.org.ar/"&gt;Microsoft User Group&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mug.org.ar/Eventos/3193.aspx" target="_blank"&gt;SEMINARIO GRATUITO &amp;quot;Programación Paralela, Programación Distribuida, High Performance Computing&amp;quot;.&lt;/a&gt;&lt;br /&gt;Thursday, January 15, 2009&lt;br /&gt;Lugar: Auditorio del MUG, Rivadavia 1479 1º A, Ciudad de Buenos Aires.  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mughpc.png" alt="" /&gt;  &lt;p&gt;Ahí está el abstract:  &lt;blockquote&gt; &lt;p&gt;Hay aplicaciones que necesitan procesar gran cantidad de información, o que tienen requerimientos de velocidad exigente. &lt;br /&gt;Exploraremos en la charla algunas tecnologías y estrategías que tenemos disponibles como:&lt;br /&gt;- Programación Paralela: usando múltiples threads, TPL (Task Parallel Library).&lt;br /&gt;- Programación Distribuida: enviando el trabajo a realizar a distintas máquinas, usando WCF o DSS/CCR&lt;br /&gt;- High Performance Computing: ejecutando jobs, tasks, y programas  &lt;p&gt;HPC Server 2008 es el producto de Microsoft que permite armar un cluster de máquinas, pudiendo llegar a tener cientos de nodos. &lt;br /&gt;Es la tendencia actual en supercomputación.  &lt;p&gt;Mostraremos ejemplos de código de cada uno.  &lt;p&gt;Las vacantes son limitadas.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;La idea es explorar algunas ideas de &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx" target="_blank"&gt;AjMessages&lt;/a&gt;, &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx" target="_blank"&gt;grid computing&lt;/a&gt;, Task Parallel Library, MPI, MPI.NET y &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx" target="_blank"&gt;programación HPC&lt;/a&gt;. También mostrar código andando, esperamos poder llevar un cluster virtualizado andando, para mostrarlo en la charla.  &lt;p&gt;Nos leemos!  &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1657959" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx">High Performance Computing</category></item><item><title>Aplicaciones distribuidas con AjMessages usando DSS/CCR</title><link>http://msmvps.com/blogs/lopez/archive/2008/10/10/aplicaciones-distribuidas-con-ajmessages-usando-dss-ccr.aspx</link><pubDate>Fri, 10 Oct 2008 11:42:46 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1650446</guid><dc:creator>lopez</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1650446</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/10/10/aplicaciones-distribuidas-con-ajmessages-usando-dss-ccr.aspx#comments</comments><description>&lt;p&gt;Por ahora, es solo un proyecto en marcha. La aplicación de ejemplo es mínima. Pero es la evolución de mi trabajo anterior con AjMessages usando&amp;nbsp; Windows Communication Foundation:&lt;/p&gt; &lt;p&gt;&lt;a title="AjMessages- a message processor" href="http://ajlopez.wordpress.com/2007/10/18/ajmessages-a-message-processor/"&gt;AjMessages- a message processor&lt;/a&gt;&lt;br /&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El año pasado excribí ese ejemplo, y otro que usaba DSS/CCR. Solo el primero fue publicado, ahora, estuve revisando mi implementación con DSS/CCR, tecnologías que son la base de &lt;a href="http://www.microsoft.com/robotics" target="_blank"&gt;Microsoft Robotics&lt;/a&gt;. El código nuevo se puede bajar del repositorio de&amp;nbsp;CodePlex en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/ajmessages" href="http://www.codeplex.com/ajmessages"&gt;http://www.codeplex.com/ajmessages&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Los ejemplos estan basados en ideas del proyecto &lt;a href="http://ajlopez.wordpress.com/2007/10/14/remember-fabriq/" target="_blank"&gt;Fabriq&lt;/a&gt;, ahora en nuevas tecnologías. En estos días, &lt;a href="http://blogs.msdn.com/asehmi" target="_blank"&gt;Arvindra Sehmi&lt;/a&gt; escribió sobre una nueva versión de Fabriq, llamada Fabriq4Dss, que está usando DSS/CCR como base. Preparó una presentación para la conferencia JAOO, lean:&lt;/p&gt; &lt;p&gt;&lt;a title="JAOO 2008 Presentation" href="http://blogs.msdn.com/asehmi/archive/2008/10/03/jaoo-2008-presentation.aspx"&gt;JAOO 2008 Presentation&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Espero que pronto aparezcan novedades sobre esa implementación y otras. Keep tuned!&lt;/p&gt; &lt;h3&gt;La solución&lt;/h3&gt; &lt;p&gt;Tiene tres proyectos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessages2008sln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El primero es la implementación del núcleo del sistema, que es independiente del transporte de los mensajes distribuidos:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessages2008prj1.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El segundo proyecto contiene un ejemplo con un message handler que decrementa un entero. El tercer proyecto es un DSS Service Component que se usa para albergar el servidor de AjMessages en una máquina con un DSS Host:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessages2008prj2.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Para una más detallada explicación de qué es una aplicación, mensaje, servidor, leer mis anteriores posts:&lt;/p&gt; &lt;p&gt;&lt;a title="AjMessages- a message processor" href="http://ajlopez.wordpress.com/2007/10/18/ajmessages-a-message-processor/"&gt;AjMessages- a message processor&lt;/a&gt;&lt;br /&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;La aplicación&lt;/h3&gt; &lt;p&gt;Un archivo de configuración XML define las aplicaciones a ejecutar. Una aplicación tiene:  &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt;: una colección de acciones a procesar (un nodo tiene varias acciones, podría ser análogo a clase/método).  &lt;li&gt;&lt;strong&gt;Handlers&lt;/strong&gt;: objetos que procesan mensajes. Un handler puede estar compuesto de otros handlers.  &lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt;: puntos con nombre para entrar a un handler &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Un ejemplo de definición de aplicación en&amp;nbsp;AjMessages.SampleApp\Configurations\Server1.xml:  &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a9f878a1-2449-441f-99ea-2736884f0b42" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ConfigureHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.ConfigureHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PrintHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PrintHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PrintMessageHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PrintMessageHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ConfigurePipeline&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PrintHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Text&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Reconfiguring server...&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ConfigureHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Configure&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ConfigurePipeline&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PrintMessageHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PrintMessageHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PostHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PostHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DecrementHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.SampleApp.Handlers.DecrementHandler, AjMessages.SampleApp&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Pipeline1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DecrementHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PostHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1/Node1/Process&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Process&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Pipeline1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Server1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Activate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Server2&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;http://localhost:50002/ajmessages/node&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;AjMessages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Ejecutando el ejemplo&lt;/h3&gt;
&lt;p&gt;Abrimos la solución en el Visual Studio 2008 (se necesita&amp;nbsp;tener instalado un&amp;nbsp;Microsoft Robotics Developer Studio, una versión&amp;nbsp;CTP de este año, debe configurar el directorio de salida de los proyectos para que apunten a su directorio de MRDS). Al ejecutar el proyecto DSS se lanza un DSS Host, que muestra una ventana de control:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessages2008contr1.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;El host está ejecutando en las puertas 50000/50001. Configure el servidor AjMessages usando el archivo AjMessages.SampleApp\Configurations\Server1.xml.&lt;/p&gt;
&lt;p&gt;Podemos lanzar un segundo host desde el prompt de DSS:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;bin/dsshost /p:50002 /t:50003 &lt;br /&gt;m:&amp;lt;pathto&amp;gt;\Source\AjMessages.DssServices\AjMessagesDssServices.manifest.xml&lt;/font&gt; 
&lt;p&gt;Un segundo formulario aparece: 
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessages2008contr2.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Use el archivo de configuración AjMessages.SampleApp\Configurations\Server2.xml&amp;nbsp;y el port&amp;nbsp;50002.&lt;/p&gt;
&lt;p&gt;Podemos enviar un mensaje a la aplicación de ejemplo (que ejecuta en dos hosts). El mensaje es solamente un entero, que es decrementado en cada proceso de acción en cada nodo. El nodo de decremento está instalado en ambos servidores, así que el mensaje viaja de uno a otro durante su proceso.&lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Quiero mejorar varios puntos. Me gustaría serializar cualquier tipo de mensaje, ahora solamente viajan enteros y strings. Me gustaría usar un solo archivo de configuración, en lugar de uno por máquina. Y poder tener en una sola solución, ambas implementaciones de hosting y transporte: DSS/CCR y WCF.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1650446" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx">Concurrency and Coordination Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx">Decentralized Software Services</category></item><item><title>CCR usado en mensajes asincrónicos</title><link>http://msmvps.com/blogs/lopez/archive/2008/09/19/ccr-usado-en-mensajes-asincr-243-nicos.aspx</link><pubDate>Fri, 19 Sep 2008 10:09:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648290</guid><dc:creator>lopez</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1648290</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/09/19/ccr-usado-en-mensajes-asincr-243-nicos.aspx#comments</comments><description>&lt;p&gt;Leo en el blog de &lt;a href="http://blogs.msdn.com/asehmi/" target="_blank"&gt;Arvindra Sehmi&lt;/a&gt; que la gente de &lt;a href="http://www.swhouse.com/home/default.aspx" target="_blank"&gt;Tyco Software House&lt;/a&gt; implementó un sistema donde usando &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163556.aspx" target="_blank"&gt;CCR&lt;/a&gt; (Concurrent and Coordination Runtime), la librería que viene dentro de &lt;a href="http://www.microsoft.com/robotics"&gt;Microsoft Robotics&lt;/a&gt;. En su artículo &lt;a title="ARCast.TV - Nice Example of CCR Adoption in the Enterprise" href="http://blogs.msdn.com/asehmi/archive/2008/09/18/arcast-tv-nice-example-of-ccr-adoption-in-the-enterprise.aspx"&gt;ARCast.TV - Nice Example of CCR Adoption in the Enterprise&lt;/a&gt;&amp;nbsp;muestra el video donde la gente de Tyco explica cómo consiguieron procesar gran cantidad de mensajes, basándose en envío asincrónico. &lt;/p&gt; &lt;p align="center"&gt;&lt;iframe src="http://channel9.msdn.com/shows/ARCast.TV/413356/player/" frameborder="0" width="320" scrolling="no" height="325"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/shows/ARCast.TV/ARCastTV-Stephen-Tarmey-of-Tyco-on-adopting-Robotics-Studio-CCR-for-High-Performance-Async-IO/"&gt;ARCast.TV - Stephen Tarmey of Tyco on adopting Robotics Studio CCR for High Performance Async IO&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Me gustaría que mostraran algo más gráfico del sistema que armaron, pero igual es interesante escuchar a alquien que usa a Microsoft Robotics aplicado a la empresa.&lt;/p&gt; &lt;p&gt;Ya Arvindra había comentado usos de DSS/CCR más allá de Robotics en&lt;/p&gt; &lt;p&gt;&lt;a title="DSS Use Cases in the Enterprise" href="http://blogs.msdn.com/asehmi/archive/2008/06/12/ccr-dss-use-cases-in-the-enterprise.aspx"&gt;DSS Use Cases in the Enterprise&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Todavía algunos de esos usos no están publicados, pero espero que aparezcan más casos de éxito con el tiempo.&lt;/p&gt; &lt;p&gt;El año pasado escribí y publiqué un ejemplo AjMessages, con intercambio de mensajes asincrónicos, usando WCF como comunicación entre nodos de una grilla:&lt;/p&gt; &lt;p&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt;&lt;/p&gt; &lt;p&gt;También el año pasado escribí una versión para usar CCR internamente, y DSS como comunicación entre los nodos, pero no la publiqué. El núcleo del sistema se puede implantar en un host WCF o en un host DSS. Me gustaría en estos días, pulir un poco el código, y publicar el ejemplo, para ver que uno puede usar CCR internamente para encolar mensajes en memoria, y repartirlos en un pool de threads que maneja internamente CCR, mientras al mismo tiempo, repartimos mensajes en otros nodos de la grilla, si los hubiera, sin mayor problema, para conseguir escalabilidad usando más máquinas de forma transparente. Como ejemplo de uso, podría reescribir el Web Crawler o el programa de Fractal, que escribí directamente para DSS/CCR/VPL:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/06/23/agentes-distribuidos-y-fractales-usando-dss-vpl.aspx" target="_blank"&gt;Agentes Distribuidos y Fractales usando DSS/VPL&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx" target="_blank"&gt;Agentes Distribuidos usando DSS/VPL&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pero imaginen que pueden repartir una tarea entre varias máquinas, incluso remotas. Imaginen que pueden enviar una tarea a realizar (como recolectar información para un informe de Business Intelligence) a una sucursal, y otra tarea a máquinas de otra sucursal dentro de su empresa. Pueden recibir los resultados como mensajes, usando un patrón del tipo request-response. Podemos codificar &amp;quot;agentes&amp;quot; que se envíen mensajes entre sí, para colaborar en un objetivo.&lt;/p&gt; &lt;p&gt;Creo que el modelo de mensaje asincrónico junto con la implementación de grilla, puede ser explotado de muchas maneras. Mi idea es aprovechar mi semana sabática (que comienza mañana) para codificar algunos proyectos, y uno de ellos es una versión más terminada de AjMessages.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648290" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx">Concurrency and Coordination Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx">Decentralized Software Services</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Microsoft+Robotics+Developer+Studio/default.aspx">Microsoft Robotics Developer Studio</category></item><item><title>Recursos de Grid Computing</title><link>http://msmvps.com/blogs/lopez/archive/2008/05/10/recursos-de-grid-computing.aspx</link><pubDate>Sat, 10 May 2008 08:06:13 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1618730</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1618730</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/05/10/recursos-de-grid-computing.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Desde el año pasado, y más en estas últimas semanas, he estado investigando sobre Grid Computing, buscando enlaces, recursos, &amp;quot;papers&amp;quot;, implementaciones. Este post es el resultado de esa investigación.  &lt;p&gt;Como siempre, un artículo de la Wikipedia: &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Grid_computing" href="http://en.wikipedia.org/wiki/Grid_computing"&gt;http://en.wikipedia.org/wiki/Grid_computing&lt;/a&gt; &lt;p&gt;Si Ud. se está iniciando en el mundo de Grid Computing, estas son buenas introducciones  &lt;p&gt;&lt;a href="http://www-128.ibm.com/developerworks/grid/newto/?ca=dgr-lnxw97Grid-Coumputing" target="_blank"&gt;New to Grid Computing&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www-03.ibm.com/grid/" target="_blank"&gt;Grid Computing according IBM&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www-unix.globus.org/alliance/publications/papers/anatomy.pdf" target="_blank"&gt;The anatomy of the grid&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www-unix.globus.org/alliance/publications/papers/ogsa.pdf" target="_blank"&gt;The physiology of the grid&lt;/a&gt;&amp;nbsp;&amp;nbsp;  &lt;p&gt;Interesante lista de lecturas para desarrolladores en Grid &lt;p&gt;&lt;a href="http://www.gridblog.com/comments.php?id=242_0_1_0_C" target="_blank"&gt;Recommended reading list for grid developers&lt;/a&gt;  &lt;p&gt;Grid Café tiene varios artículos y recursos &lt;p&gt;&lt;a href="http://gridcafe.web.cern.ch/gridcafe/gridprojects/projects.html" target="_blank"&gt;Grid Cafe Grid Projects in the world&lt;/a&gt;&amp;nbsp;&amp;nbsp;  &lt;p&gt;&lt;a href="http://gridcafe.web.cern.ch/gridcafe/"&gt;Grid Cafe The place for everybody to learn about the Grid&lt;/a&gt;&amp;nbsp;&amp;nbsp;  &lt;p&gt;&lt;a href="http://gridcafe.web.cern.ch/gridcafe/whatisgrid/dreamers.html" target="_blank"&gt;What is &amp;quot;the Grid&amp;quot;?&lt;/a&gt;&amp;nbsp;&amp;nbsp;  &lt;p&gt;&lt;a href="http://gridcafe.web.cern.ch/gridcafe/GridatCERN/gridatcern.html" target="_blank"&gt;Grid @ CERN&lt;/a&gt;&amp;nbsp;  &lt;p&gt;Sobre el estado de la industria:  &lt;p&gt;&lt;a href="http://www.gridtoday.com/"&gt;http://www.gridtoday.com/&lt;/a&gt; (un poco demasiado abarcativo, no es sólo sobre grid computing)  &lt;p&gt;&lt;a href="http://www.gridblog.com/"&gt;http://www.gridblog.com/&lt;/a&gt;  &lt;p&gt;La lista completa de enlaces que mantengo, en:  &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/gridcomputing"&gt;http://del.icio.us/ajlopez/gridcomputing&lt;/a&gt;  &lt;p&gt;Algunos productos para examinar:  &lt;p&gt;&lt;a href="http://www.gridgain.com/"&gt;http://www.gridgain.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.digipede.net/"&gt;http://www.digipede.net&lt;/a&gt;&amp;nbsp;algo más sobre Digipede en &lt;a href="http://dotnetjunkies.com/WebLog/stefandemetz/archive/2006/12/09/Free_Grid_Computing_software.aspx"&gt;http://dotnetjunkies.com/WebLog/stefandemetz/archive/2006/12/09/Free_Grid_Computing_software.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gridgistics.net/"&gt;http://www.gridgistics.net/&lt;/a&gt;  &lt;p&gt;&lt;a href="http://sourceforge.net/projects/ngrid/"&gt;http://sourceforge.net/projects/ngrid/&lt;/a&gt;  &lt;p&gt;Algo relacionado, que comienza a &amp;quot;estar de moda&amp;quot;:  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Cloud_computing" href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;http://en.wikipedia.org/wiki/Cloud_computing&lt;/a&gt;&lt;/p&gt; &lt;p&gt;He escrito artículos en este blog sobre Grid Computing:  &lt;p&gt;&lt;a title="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx" href="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx"&gt;http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx&lt;/a&gt; &lt;p&gt;y en &amp;quot;Anglish&amp;quot;, Angel&amp;#39;s English: &lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/category/grid-computing/"&gt;http://ajlopez.wordpress.com/category/grid-computing/&lt;/a&gt; &lt;/p&gt; &lt;p&gt;donde hay algunas implementaciones sencillas de ideas a seguir explorando, como &lt;a title="AjAgents" href="http://msmvps.com/blogs/lopez/archive/tags/AjAgents/default.aspx"&gt;AjAgents&lt;/a&gt;, y &lt;a title="AjMessages" href="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx"&gt;AjMessages&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Esta lista de recursos, en Anglish, desde:&lt;/p&gt; &lt;p&gt;&lt;a title="Grid Computing Resources" href="http://ajlopez.wordpress.com/2008/04/18/grid-computing-resources/"&gt;Grid Computing Resources&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1618730" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjAgents/default.aspx">AjAgents</category></item><item><title>Agentes en Grid</title><link>http://msmvps.com/blogs/lopez/archive/2008/05/08/agentes-en-grid.aspx</link><pubDate>Thu, 08 May 2008 10:14:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1617275</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1617275</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/05/08/agentes-en-grid.aspx#comments</comments><description>&lt;p&gt;El año pasado participé del desarrollo de una aplicación que se ejecuta en una grilla de máquinas sin disco. Este año, estoy volviendo a actualizar el proyecto, espero poder bloggear sobre el resultado dentro de un mes. Mientras, quisiera escribir sobre algunas ideas a explorar.&lt;/p&gt; &lt;p&gt;En este post, uso el término &amp;quot;agente&amp;quot;, de una forma algo libre. No definiré precisamente el concepto, quiero usarlo como término base a refinar en el futuro (llegando en algún momento a tratar el tema de agentes autónomos, que me parece más interesante). Por ahora, exploremos algunas ideas básicas (¿ingenuas?) para entender mejor los problemas relacionados con agentes y aplicaciones en grid. Algunas de las ideas acá presentadas pueden ser vistas como ingenuas, pero siento que es un ejercicio necesario, para aprehender los conceptos clave y los problemas a ser resueltos en este tipo de aplicaciones. Al final de este post, presentaré algunas sugerencias de implementación.&lt;/p&gt; &lt;p&gt;He descripto algunas aplicaciones para ejecutar en una grid en mis anteriores post:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2007/12/03/grid-computing-programming/" target="_blank"&gt;Grid Computing Programming&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="M&amp;aacute;s programando para una grid" href="http://msmvps.com/blogs/lopez/archive/2007/11/21/m-225-s-programando-para-una-grid.aspx"&gt;Más programando para una grid&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Programando para una Grid" href="http://msmvps.com/blogs/lopez/archive/2007/11/15/programando-para-una-grid.aspx"&gt;Programando para una Grid&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Conceptos de Agentes&lt;/h3&gt; &lt;p&gt;En este post, un agente es una pieza de software, con conducta y estado. Se ejecuta en un host de agentes, una aplicación que provee los servicios de base para que el agente pueda &amp;quot;vivir&amp;quot; y trabajar. Representaremos al agente con esta figura:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid01.png" alt="" /&gt; &lt;/p&gt; &lt;h3&gt;Patrones de comunicación de agentes&lt;/h3&gt; &lt;p&gt;Hay mucha literatura sobre comunicación de agentes, desde simples técnicas hasta elaborados contratos, negociaciones, y más. Podemos tener agentes con creencias, deseos e intenciones. En este post, un agente es más simple: sólo tiene estado, puede enviar y recibir mensajes. Puede recibir estímulos de otros agentes y desde el ambiente de su host.&lt;/p&gt; &lt;p&gt;El más simple patrón de comunicación es un agente enviando un mensaje a otro agente:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid02.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Algunas notas:&lt;/p&gt; &lt;p&gt;-&amp;nbsp;El agente enviador conoce al agente receptor. Quiero decir, alguna forma de identidada debe ser implementada. El mensaje no es enviado a cualquiera: el que envía intenta enviar el mensaje a un determinado agente.&lt;/p&gt; &lt;p&gt;- El mensaje transporta datos, y debe ser entendido por el receptor, posiblemente procesado por uno de sus métodos de implementación.&lt;/p&gt; &lt;p&gt;- En enviador no espera por una respuesta. No está interesado en un mensaje de respuesta inmediato.&lt;/p&gt; &lt;p&gt;- Los agentes pueden residir en diferentes máquinas en la grila, y la comunicación se produce tanto local como remota.&lt;/p&gt; &lt;p&gt;Durante su vida un agente puede enviar muchos mensajes a distintos agentes, que debe conocer de alguna manera:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid03.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Algunas veces, el agente enviador recibirá un&amp;nbsp;mensaje desde el agente receptor, notificando algun trabajo hecho, o enviando algún dato procesado. Dependiendo de la aplicación, el mensaje de respuesta podría acarrear información para identificar al mensaje original:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid04.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;En este caso, el enviador original debe estar preparado para recibir la respuesta de una manera asincrónica. Esto podría ser un interesante problema a resolver: un agente puede enviar varios mensajes, y sería mejora si puede seguir ejecutando sin recibir todas las respuestas a tiempo. Por ejemplo, en una aplicación de un juego de tablero, un agente puede delegar la exploración de un árbol de jugadas a otros agentes, y, luedo de un tiempo, sería posible tomar una decisión, con sólo algunas respuestas recibidas.&lt;/p&gt; &lt;h3&gt;Nubes (&amp;quot;clouds&amp;quot;) en&amp;nbsp;el cielo de la grilla&lt;/h3&gt; &lt;p&gt;Otro caso: un agente puede estar interesado en enviar un mensaje, pero no a un receptor determinado. Al contrario, quiere enviarlo a una &amp;quot;nube&amp;quot; de agentes, así cualquiera interesado en el mensaje tendría la oportunidad de procesarlo.&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid05.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Esta característica puede ser implementada usando estas estrategias:&lt;/p&gt; &lt;p&gt;- Un agente envía un mensaje a un sistema de pizarra (blackboard), que otros agentes están vigilando.&lt;/p&gt; &lt;p&gt;- Una agente enviaría una mensaje a la aplicación host, indicando un tópico (como en una cola de mensajes), así cualquier agente subscripto recibirá el mensaje. Una variante: sólo algunos subscriptores reciben el mensaje, dependiendo de parámetros de aplicación.&lt;/p&gt; &lt;p&gt;- Un agente podría enviar un mensaje dirigido a alguna definición de proveedor de servicio. Un proveedor de servicio es un agente, que declara al comienzo de su vida, sus capacidades y los servicios que puede proveer.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Un ejemplo, tomemos una aplicación de un juego de tablero, ajedrez o go. Un agente en esa aplicación puede enviar un mensaje reclamando resolver cierta posición de ataque. En un sistema de pizarra, publicará el pedido. En un sistema de tópicos, lo enviaría al tópico &amp;quot;ataques&amp;quot;. En una estrategia de proveedor de servicio, envía el mensaje a uno o más de los proveedores del servicio AttackResolver.&lt;/p&gt; &lt;p&gt;Como en el patrón anterior, un agente puede recibir una respuesta asincrónica, ahora desde&amp;nbsp;&amp;quot;la nube&amp;quot;:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid06.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Duplicación de agentes&lt;/h3&gt; &lt;p&gt;Un agente tiene conducta y estado. Si el agente puede dividir su trabajo, podría tomar el camino de duplicarse a sí mismo:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid07.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Es algo extraño, pero podría ser útil, dependiendo de la aplicación a desarrollar.&lt;/p&gt; &lt;h3&gt;Agentes y la Grilla&lt;/h3&gt; &lt;p&gt;Cada agente puede ser albergado en un nodo de la grilla. El mecanismo de envío de mensajes debe ser capaz de enviar un mensaje a otro nodo. La aplicación host mantiene una lista de&amp;nbsp;agentes por identidad, y conoce cúal&amp;nbsp; es local o remoto. Una prueba ácida: una aplicación de grilla con agentes debe ser capaz de correr en una sola máquina, o en una grilla, sin cambiar el código o el algoritmo.&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid08.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Como en otras implementaciones de grilla (discutidos en los post que mencioné al principio), un servidor central está a cargo de la distribución de las tareas entre los nodos de la grilla. &amp;quot;Grid as a Service&amp;quot; es una nueva frase que podemos aplicar a esta situación.&lt;/p&gt; &lt;h3&gt;Moviendo al Agente&lt;/h3&gt; &lt;p&gt;Un agente puede iniciar sus actividades en un node. Pero en algún momento, puede decidir de continuar su trabajo en otro nodo (la aplicación host que lo alberga también puede tomar esa decisión, independientemente del agente). Entonces, su estado sería enviado de un nodo a otro (otro caso: podría querer duplicarse y que su clon siga el trabajo en otra máquina).&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid10.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Noten que la conducta del agente (que puede estar compilada o puede estar escrita en un lenguaje dinámico o de agente), no viaja. Pero bien podría ser que viaje, incluso, que haya agentes que vayan adaptando su conducta en el tiempo.&lt;/p&gt; &lt;h3&gt;Inyectando conducta&lt;/h3&gt; &lt;p&gt;La conducta de cada agente podría ser expresada en código compilado (archivos .jar en Java, assemblies en .NET). Otras alternativas son posibles: la conducta podría ser especificada en un lenguaje de scripting dedicado a agentes (pienso en una adaptación del AjBasic, por ejemplo).&lt;/p&gt; &lt;p&gt;Si la conducta se expresa en forma compilada, uno o varios servers puede tomar la responsabilidad de almacenar y distribuir esos componentes:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/agentsgrid09.png" alt="" /&gt; &lt;/p&gt; &lt;h3&gt;Ideas de implementación&lt;/h3&gt; &lt;p&gt;Muchas de estas ideas pueden ser implementadas en cualquier lenguaje/tecnología apropiada, como Java y .NET, que soporte múltiples threads, invocación remota, serialización de mensajes, etc... &lt;/p&gt; &lt;p&gt;En los últimos tiempos estuve trabajando en mis projectos AjMessages y AjAgents, más información enestos post:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;&lt;/a&gt;&lt;a href="http://ajlopez.wordpress.com/2007/10/18/ajmessages-a-message-processor/"&gt;AjMessages: a message&amp;nbsp;processor &lt;/a&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/20/agentes-usando-concurrency-and-coordination-runtime-ccr.aspx"&gt;&lt;/a&gt;&lt;a href="http://ajlopez.wordpress.com/2007/10/17/agents-using-concurrency-and-coordination-runtime-ccr/"&gt;Agents using Concurrency and Coordination Runtime&amp;nbsp;(CCR) &lt;/a&gt; &lt;p&gt;&lt;a title="AjMessages- hacia un procesador de mensajes" href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx"&gt;AjMessages- hacia un procesador de mensajes&lt;/a&gt; &lt;p&gt;&lt;a title="Agentes usando Concurrency and Coordination Runtime (CCR)" href="http://msmvps.com/blogs/lopez/archive/2007/10/20/agentes-usando-concurrency-and-coordination-runtime-ccr.aspx"&gt;Agentes usando Concurrency and Coordination Runtime (CCR)&lt;/a&gt; &lt;p&gt;&lt;a title="Algoritmos Gen&amp;eacute;ticos con AjAgents y Concurrency and Coordination Runtime (CCR)" href="http://msmvps.com/blogs/lopez/archive/2008/04/13/algoritmos-gen-233-ticos-con-ajagents-y-concurrency-and-coordination-runtime-ccr.aspx"&gt;Algoritmos Genéticos con AjAgents y Concurrency and Coordination Runtime (CCR)&lt;/a&gt; &lt;p&gt;&lt;a title="Genetic Algorithms with AjAgents and Concurrency and Coordination Runtime (CCR)" href="http://ajlopez.wordpress.com/2008/04/10/genetic-algorithms-with-ajagents-and-concurrency-and-coordination-runtime-ccr/"&gt;Genetic Algorithms with AjAgents and Concurrency and Coordination Runtime (CCR)&lt;/a&gt; &lt;p&gt;(Tengo otro proyecto, AjGrid, no publicado aún). Para este post, creo que el AjAgents podría ser una implementación de esas ideas. AjMessages tiene ahora soporte de ejecución remota, pero está más orientado a un proceso tubería (&amp;quot;pipeline&amp;quot;): es más difícil de implementar en semejante sistemas las ideas de este post.&lt;/p&gt; &lt;p&gt;Estoy agregando algunas características a AjAgents (ahora, AjAgents trabaja sólo en local):&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Configuración&lt;/strong&gt;: Carga y creación de agentes en ejecución, según alguna información de configuración, ya sea al inicio o en el medio de la ejecución.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Assembly remoto&lt;/strong&gt;: Así un nodo de grilla pueder ser inyectado con nuevos agentes.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Identificación de Agente&lt;/strong&gt;: Para identificar al agente de manera única (un UID debería bastar).&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Transporte de mensaje&lt;/strong&gt;: Windows Communication Foundation es un candidato, otro podría ser DSSP.&lt;/p&gt; &lt;p&gt;Un posible camino es tomar Decentralized System Services (DSS) del Microsoft Robotics Developer Studio. Un agente podría ser implementado como un servicio de DSS, ejecutando en un host DSS. La comunicación entre máquinas puede ser implementada usando DSSP como protocolo.&lt;/p&gt; &lt;p&gt;&amp;quot;Stay tuned&amp;quot;, vendrá más código.&lt;/p&gt; &lt;p&gt;(Esta es una actualización y traducción de mi post en &amp;quot;Anglish&amp;quot;, Angel&amp;#39;s English:&lt;/p&gt; &lt;p&gt;&lt;a title="Agents in a Grid" href="http://ajlopez.wordpress.com/2008/01/03/agents-in-a-grid/"&gt;Agents in a Grid&lt;/a&gt;&lt;/p&gt; &lt;p&gt;)&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1617275" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjAgents/default.aspx">AjAgents</category></item><item><title>AjMessages: hacia un procesador de mensajes</title><link>http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx</link><pubDate>Mon, 22 Oct 2007 10:05:23 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1257317</guid><dc:creator>lopez</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1257317</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx#comments</comments><description>&lt;p&gt;Siguiendo las ideas del proyecto &lt;a href="http://ajlopez.wordpress.com/2007/10/14/remember-fabriq/"&gt;Fabriq&lt;/a&gt;, estuve escribiendo un ejemplo de una aplicación servidora que puede recibir y procesar mensajes OneWay de&amp;nbsp; Windows Communication Foundation (WCF). El servidor ejecuta un concepto lógico, una aplicación: cada aplicación tiene nodos, que a su vez contienen acciones. El ejemplo puede bajarse de &lt;a href="http://www.ajlopez.com/downloads/AjMessagesWCF-0.1.1.zip"&gt;AjMessagesWCF-0.1.1.zip&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;El mensaje&lt;/h3&gt; &lt;p&gt;El mensaje a comunicar es un mensaje WCF (en la versión original de Fabriq no se usa WCF). La información principal que AjMessages usa está en la propiedad Headers.Action. Ese texto tiene el nombre de la aplicación destino, el nodo y la acción a invocar.&lt;/p&gt; &lt;h3&gt;La acción&lt;/h3&gt; &lt;p&gt;Tiene el formato:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;lt;application&amp;gt;/&amp;lt;node&amp;gt;/&amp;lt;action&amp;gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Una aplicación tiene un conjunto de nodos. Un servidor puede albergar uno o varios nodos de una aplicación. Un nodo puede ejecutarse en distintos servidores. De esta forma, el proceso interno del servidor puede reenviar un mensaje a otro servidor: la acción no es una dirección física, sino que es lógica. Cada server conoce la dirección y nodos en ejecución de los demas, porque se le informa en un archivo de configuración, o dinámicamente durante la misma ejecución. Con esa información puede reenviar un mensaje a otra máquina.&lt;/p&gt; &lt;h3&gt;La aplicación&lt;/h3&gt; &lt;p&gt;Un archivo de configuración XML define las aplicaciones que un servidor conoce. Una aplicación tiene:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt;: cada nodo es un conjunto de acciones a procesar. Nodo es a acción, como clase es a método.  &lt;li&gt;&lt;strong&gt;Handlers&lt;/strong&gt;: los objetos que procesan un mensaje. Un handler puede estar compuesto de otros handlers.  &lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt;: los puntos de entrada con nombre a un handler&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Un ejempl de definición de aplicación:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:fc53ac97-91b0-4020-95b9-4361a96bcefb" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PrintMessageHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PrintMessageHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PostHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.PostHandler, AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DecrementHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages.Console01.DecrementHandler, AjMessages.Console01&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Pipeline1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;DecrementHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;PostHandler&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App2/Node1/Process&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Action &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Process&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Handler&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Pipeline1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;El handler&lt;/h3&gt;
&lt;p&gt;Un handler debe implementar la interfaz:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b8b47306-3c06-492d-a5a5-8716b0ec7f6d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#000000;"&gt; IHandler
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Process(Context ctx);
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;El contexto tiene una propiedad Message, que apunta al mensaje WCF en proceso. También tiene otros métodos para usar: una propiedad Server que referencia al servidor en ejecución, y un método Post para enviar un nuevo mensaje. La idea es colocar en el contexto todo lo necesario para que un handler se comunique con el proceso en ejecución.&lt;/p&gt;
&lt;p&gt;Esta es una diferencia con la implementación original de Fabriq, donde un handler recibe un mensaje, no un contexto.&lt;/p&gt;
&lt;h3&gt;El host&lt;/h3&gt;
&lt;p&gt;Un host es una unidad lógica que se ejecuta dentro de un servidor AjMessages. Un servidor conoce via configuración cuáles son los hosts que tiene disponibles remotamente,&amp;nbsp;y cuáles levantar localmente. Un ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f2e042e9-35d0-4f14-a885-f4ba26a93e5b" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Host1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;http://localhost:50000/AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Activate&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;AjMessages&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Administration&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;App1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Node &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Node2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Application&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Configuración dinámica&lt;/h3&gt;
&lt;p&gt;Uno de las características claves implementadas es un handler que reconfigura al servidor durante la ejecución, en runtime. Recibe una nueva configuración XML, en un string, y con eso actualiza la configuración que tenga en ese momento. Usando este handler, una aplicación puede enviar un mensaje al servidor AjMessages, y cargar, parar, actualizar hosts, aplicaciones y nodos.&lt;/p&gt;
&lt;h3&gt;La solución&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajmessagewcf01.jpg" align="left" alt="" /&gt;&amp;nbsp;El proyecto de librería de clases &lt;strong&gt;AjMessages&lt;/strong&gt; contiene la implementación del ejemplo. Los otros proyectos son tests manuales que muestrar el uso de la librería.&lt;/p&gt;
&lt;p&gt;Dentro de la carpeta&amp;nbsp;&lt;strong&gt;Configuration&lt;/strong&gt; hay clases definidas para leer la configuración desde un XML.&lt;/p&gt;
&lt;p&gt;La carpeta &lt;strong&gt;Handlers&lt;/strong&gt; contiene algunos handlers ya definidos, el más importante es&amp;nbsp;el ConfigurationHandler que permite reconfigurar dinámica al servidor mientras está en ejecución.&lt;/p&gt;
&lt;p&gt;La carpeta &lt;strong&gt;Ports&lt;/strong&gt; tiene implementaciones de endpoints para recibir y enviar mensaje a otro servidor AjMessages.&lt;/p&gt;
&lt;p&gt;El &lt;strong&gt;PipelineHandler.cs&lt;/strong&gt; es el hadler compuesto, que contiene otros handler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LocalHost.cs&lt;/strong&gt; es la implementación de un host que se está ejecutando en el mismo server. Mantiene una lista de los nodos activos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RemoteHost.cs&lt;/strong&gt; mantiene la información asociado a los hosts que se ejecutan en otros servidores. Con esa información, el servidor local conoce cómo reenviar un mensaje, al saber qué servidores remotos tienen un nodo apropiado para la acción del mensaje.&lt;/p&gt;
&lt;h3&gt;Ejecutando el ejemplo&lt;/h3&gt;
&lt;p&gt;Hay un proyecto de consola &lt;strong&gt;AjMessages.Console01&lt;/strong&gt; que puede ser usado como un test manual, para probar el funcionamiento del ejemplo. &lt;/p&gt;
&lt;p&gt;Se puede ejecutar el ejemplo, y al lanzarlo, pide comandos por la consola. Una prueba posible es la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationServer1.xml&lt;br /&gt;load ConfigurationHost1.xml&lt;br /&gt;load ConfigurationHost2.xml&lt;br /&gt;send App1/Node1/Process 20&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;El primer comando crear el servidor, usando el archivo de configuración. El segundo y tercer comando reconfigura el servidor para instalar y ejecutar dos hosts, con sus aplicaciones y nodos. El último comando envía un mensaje entero usando la acción App1/Node1/Process.&lt;/p&gt;
&lt;p&gt;Luego, podemos ingresar:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;unload&lt;br /&gt;fork&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Esto lanza otro servidor de consola. En el primer servidor, ingresamos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationServer1.xml&lt;br /&gt;load ConfigurationHost1.xml&lt;br /&gt;load ConfigurationRemoteHost2.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;y en el segundo:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;load ConfigurationServer2.xml&lt;br /&gt;load ConfigurationHost2.xml&lt;br /&gt;load ConfigurationRemoteHost1.xml&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;En cualquier de los dos, ingresamos:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;send App1/Node1/Process 20&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;y vermos a los dos servidores intercambiar mensajes.&lt;/p&gt;
&lt;p&gt;En cualquier momento, al ingresar:&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;help&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;obtenemos una lista de comandos a usar.&lt;/p&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;En una futura versión, reescribiré el ejemplo para usar un Message propio, capaz de ser transportado via WCF o DSS (Decentralized System Services). Así, el servidor podrá albergarse&amp;nbsp;en otras tecnologías. Debo refactorizar algunas clases, como Server, que ha quedado con muchas responsabilidades.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1257317" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Windows+Communication+Foundation/default.aspx">Windows Communication Foundation</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category></item></channel></rss>