<?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 : Grid Computing</title><link>http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx</link><description>Tags: Grid Computing</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>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>Realidad aumentada con Windows HPC</title><link>http://msmvps.com/blogs/lopez/archive/2008/12/02/realidad-aumentada-con-windows-hpc.aspx</link><pubDate>Tue, 02 Dec 2008 04:26:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1655542</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=1655542</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/12/02/realidad-aumentada-con-windows-hpc.aspx#comments</comments><description>&lt;p&gt;En estos d&amp;iacute;as estoy trabajando con Windows High Performance Computing Server 2008. Investigando sobre el tema en la red (en especial en Twitter), encuentro esta demostraci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JksDWFQwOOM"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JksDWFQwOOM" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WEfr9WmCtgg"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WEfr9WmCtgg" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Es un trabajo de la gente del &lt;a target="_blank" href="http://www.hlrs.de/research/"&gt;High Performance Computing Center de Stuttgart&lt;/a&gt; (HLRS)&lt;/p&gt;
&lt;p&gt;Se llama realidad aumentada a un tipo de realidad virtual que combina im&amp;aacute;genes reales e imaginarias. Por ejemplo, usando un &amp;quot;headset&amp;quot; transparente podr&amp;iacute;amos ver c&amp;oacute;mo una mesa se ver&amp;iacute;a en nuestra sala, o ver un esquema en 3D de un motor mientras lo estamos reparando. La gente de HLRS est&amp;aacute; trabajando con el Microsoft Technical Computing Initiative en cosas como &lt;a href="http://www.hlrs.de/organization/vis/projects/mstci/" title="Augmented Reality in the automotive industry"&gt;Augmented Reality in the automotive industry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="240" src="http://www.hlrs.de/organization/vis/projects/mstci/sc07.jpg" height="174" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Pueden ver algunas fotos de las instalaciones que tienen en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hlrs-ic.spaces.live.com/" title="Microsoft HPC Institute - HLRS - University of Stuttgart"&gt;Microsoft HPC Institute - HLRS - University of Stuttgart&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.hlrs.de/people/becker/visent/left.JPG" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Igualito al hardware que tengo en mi casa.... :-)&lt;/p&gt;
&lt;p&gt;Encontr&amp;eacute; estos videos en&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.sltalk.de/index.php/2008/12/01/augmented-reality-mit-windows-hpc/"&gt;Augmented Reality mit Windows HPC&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hay m&amp;aacute;s videos sobre HPC, y depuraci&amp;oacute;n MPI, en&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.youtube.com/results?search_query=HLRS&amp;amp;search=tag"&gt;HLRS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Algo m&amp;aacute;s de informaci&amp;oacute;n sobre Augmented Reality&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.hpcwire.com/blogs/27626804.html"&gt;What Is the Metaverse and Should HPC Care?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Augmented_reality" title="Augmented reality - Wikipedia, the free encyclopedia"&gt;Augmented reality - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mixed_reality" title="Mixed reality - Wikipedia, the free encyclopedia"&gt;Mixed reality - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.augmented-reality.org/iwar/"&gt;International Symposium on Mixed and Augmented Reality (ISMAR)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.augmented.org/"&gt;&lt;/a&gt;&lt;a href="http://www.augmented.org/"&gt;&lt;/a&gt;&lt;a href="http://www.augmented.org/" title="http://www.augmented.org/"&gt;http://www.augmented.org/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.howstuffworks.com/augmented-reality.htm"&gt;How Augmented Reality Will Work&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Llegaremos a tener nuestro &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Holodeck"&gt;Holodek&lt;/a&gt;? &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=1655542" width="1" height="1"&gt;</description><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/Video/default.aspx">Video</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx">High Performance Computing</category></item><item><title>Grid as a Service</title><link>http://msmvps.com/blogs/lopez/archive/2008/11/11/grid-as-a-service.aspx</link><pubDate>Tue, 11 Nov 2008 08:28:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653735</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=1653735</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/11/11/grid-as-a-service.aspx#comments</comments><description>&lt;p&gt;Desde el último año, estuve trabajando con tecnologías relacionados con computación distribuida. Actualmente, mi trabajo está relacionado con Windows HPC (High Performance Computing). Pero también estuve en contacto con DSS/CCR de Microsoft Robotics, WCF (Windows Communication Foundation), y examiné algunas implementaciones de Java, como &lt;a href="http://www.gridgain.com/" target="_blank"&gt;GridGain&lt;/a&gt;. Mencioné el concepto de Grid as&amp;nbsp;a Service como una idea para implementar en mi posts &lt;a href="http://ajlopez.wordpress.com/2007/12/03/grid-computing-programming/" target="_blank"&gt;Grid Computing Programming&lt;/a&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;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;Un Grid as a Service es algo que podría ser implementado sobre diferentes tecnologías de base. Supongo que debe haber alguna implementación de estas ideas. Ésta es la idea que tengo en mente:&lt;/p&gt; &lt;p&gt;- Una grilla de computadoras, heterogéneas, de línea&lt;/p&gt; &lt;p&gt;- Software para distribuir una o varias tareas en la grilla&lt;/p&gt; &lt;p&gt;- API y front end Web, para definir y subir una aplicación en grilla.&lt;/p&gt; &lt;p&gt;- API e interface&amp;nbsp;Web interface, para lanzar la ejecución de esa aplicación&lt;/p&gt; &lt;p&gt;La aplicación en grilla podría contener:&lt;/p&gt; &lt;p&gt;- Ejecutables, como .exe, .dlls (si está basado en Windows) o .jar (en Java).&lt;/p&gt; &lt;p&gt;-&amp;nbsp;Un manifiesto, describiendo las características de la aplicación: parámetros necesarios, salida esperada&amp;nbsp;(archivo,&amp;nbsp;base de datos, XML,...)&lt;/p&gt; &lt;p&gt;Para lanzar una tarea, el usuario provee los parámetros de entrada, para enviar a ejecutar una aplicación ya cargada y definida en la grilla. Al final de la ejecución, recibiría una notificación, posiblemente una URL con el resultado calculado.&lt;/p&gt; &lt;p&gt;Mi trabajo con &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/AjAgents/default.aspx" target="_blank"&gt;AjAgents&lt;/a&gt;, está, de alguna manera, orientado a este objetivo de grid as a service.&lt;/p&gt; &lt;p&gt;La grilla de soporte podría ser expandida para tomar más poder y capacidad de otras grillas. Esto es, la misma API que el desarrollador de aplicaciones usaría, podría ser consumida por otras grillas para sus aplicaciones.&lt;/p&gt; &lt;p&gt;Las máquinas podrían ser provistas por data centers (cada año que pase habrá más data centers disponibles, a costo razonables), como los que actualmente proveen servicios en el &amp;quot;cloud&amp;quot; o máquinas virtuales.&lt;/p&gt; &lt;p&gt;Habría varios detalles a discutir, como el monitoreo, nivel de servicio, temas de seguridad. Una alternativa es programar en una &amp;quot;sandbox&amp;quot;, o en un lenguaje dedicado orientado a grilla o computación en paralelo. Computación en paralelo no es lo mismo que computación en grilla: en mi opinión, grid computing es más flexible, una aplicación en grilla podría enviar mensajes a cualquier nodo en la grilla,&amp;nbsp;en cualquier momento, en cambio,&amp;nbsp;la computación en paralelo está&amp;nbsp;más&amp;nbsp;orientada a algoritmos como map reduce, y&amp;nbsp;tecnologías más sincronizadas como MPI (Message-passing interface).&lt;/p&gt; &lt;p&gt;Otros enlaces relacionados:&lt;/p&gt; &lt;p&gt;&lt;a title="Recursos de Grid Computing" href="http://msmvps.com/blogs/lopez/archive/2008/05/10/recursos-de-grid-computing.aspx"&gt;Recursos de Grid Computing&lt;/a&gt;&lt;br /&gt;&lt;a title="Recursos de Windows High Performance Computing (HPC) y Programaci&amp;oacute;n" href="http://msmvps.com/blogs/lopez/archive/2008/11/08/recursos-de-windows-high-performance-computing-hpc-y-programaci-243-n.aspx"&gt;Recursos de Windows High Performance Computing (HPC) y Programación&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/gridcomputing"&gt;http://delicious.com/ajlopez/gridcomputing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/hpc"&gt;http://delicious.com/ajlopez/hpc&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;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=1653735" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category></item><item><title>Recursos de Windows High Performance Computing (HPC) y Programación</title><link>http://msmvps.com/blogs/lopez/archive/2008/11/08/recursos-de-windows-high-performance-computing-hpc-y-programaci-243-n.aspx</link><pubDate>Sat, 08 Nov 2008 13:44:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653506</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=1653506</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/11/08/recursos-de-windows-high-performance-computing-hpc-y-programaci-243-n.aspx#comments</comments><description>&lt;p&gt;Desde el último año, estuve investigando sobre computación distribuida y en grilla. Encontré bastantes recursos útiles, información, que fui agregando a mi delicious. Uno de los tópicos que encontré es la implementación de Microsoft de High Performance Computing (HPC). Este post es una lista de los recursos más relevantes que estoy usando.&lt;/p&gt; &lt;p&gt;Primero, hay que ver la página de&amp;nbsp;Windows HPC Server 2008:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/hpc"&gt;http://www.microsoft.com/hpc&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/hpcppt01.png" align="left" alt="" /&gt;El primer video para mirar es el de último PDC 2008, la sesión de HPC:&lt;/p&gt; &lt;p&gt;HPC Session at last PDC&lt;br /&gt;&lt;a href="http://channel9.msdn.com/pdc2008/ES13/"&gt;http://channel9.msdn.com/pdc2008/ES13/&lt;/a&gt;  &lt;p&gt;Excelente presentación, cubriendo el nuevo Windows HPC Server 2008, nodos, tareas, trabajos, herramientas de programación, formas de programar, programación MPI (Message Passing Interface) y MPI.NET, computer go en HPC (hermosa idea, jugar al go en cluster), toda la presentación merece un post aparte.  &lt;p&gt;Me gustó también un video corto pero interesante, que muestra la consola de administración en:  &lt;p&gt;&lt;a href="http://channel9.msdn.com/shows/The+HPC+Show/Five-Minute-Intro-to-the-HPC-Server-2008-Management-Console/"&gt;http://channel9.msdn.com/shows/The+HPC+Show/Five-Minute-Intro-to-the-HPC-Server-2008-Management-Console/&lt;/a&gt;  &lt;p&gt;EL blog a leer es &lt;a href="http://blogs.msdn.com/hpctrekker/"&gt;Windows HPC survival guide&lt;/a&gt;  &lt;p&gt;Un post como ejemplo: &lt;a href="http://blogs.msdn.com/hpctrekker/archive/2008/09/22/no-scientist-left-behind-with-cray-supercomputer-running-windows-hpc-server-2008.aspx"&gt;No scientist left behind with CRAY Supercomputer running Windows HPC Server 2008&lt;/a&gt;  &lt;p&gt;Hay una colección de recursos en &lt;a href="http://resourcekit.windowshpc.net/Default.html"&gt;HPC Resource Kit&lt;/a&gt;  &lt;p&gt;Todos los videos de HPC:  &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/HPC/"&gt;HPC | Tags | Channel 9&lt;/a&gt;  &lt;p&gt;(tópicos interesantes: WCF y programación&amp;nbsp;HPC, HPC Basic Profile: servicios web para invocar desde Java y otros lenguajes)  &lt;p&gt;Hay un sitio de comunidad dedicado a Windows HPC:  &lt;p&gt;&lt;a title="http://www.windowshpc.net/" href="http://www.windowshpc.net/"&gt;http://www.windowshpc.net/&lt;/a&gt;  &lt;p&gt;con archivos, recursos, código fuente y ejemplos.&amp;nbsp;  &lt;h3&gt;Software para usar&lt;/h3&gt; &lt;p&gt;Para iniciarse en la programación para&amp;nbsp;HPC, hay que instalar &lt;a href="http://msdn.microsoft.com/en-us/library/cc853440(VS.85).aspx"&gt;Microsoft HPC Pack (Windows)&lt;/a&gt;. Lo bajé desde:  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=12887da1-9410-4a59-b903-693116bfd30e&amp;amp;displaylang=en" target="_blank"&gt;HPC Pack 2008 SDK download&lt;/a&gt;  &lt;p&gt;(no hace falta un HPC Server para los primeros pasos)  &lt;p&gt;Luego, instalé &lt;a href="http://www.osl.iu.edu/research/mpi.net/software/" target="_blank"&gt;MPI.NET Software&lt;/a&gt;  &lt;p&gt;(Instalé el &lt;a title="MPI.NET SDK.msi" href="http://www.osl.iu.edu/research/mpi.net/files/1.0.0/MPI.NET%20SDK.msi"&gt;MPI.NET SDK.msi&lt;/a&gt;&amp;nbsp;pero también expandí el &lt;a title="MPI.NET-1.0.0.zip" href="http://www.osl.iu.edu/research/mpi.net/files/1.0.0/MPI.NET-1.0.0.zip"&gt;MPI.NET-1.0.0.zip&lt;/a&gt;: éste tiene mejores ejemplos, ya armados como soluciones de Visual Studio)  &lt;p&gt;Un excelente tutorial, sobre programación secuencial, en paralelo, y luego usando HPC 2008, en:  &lt;p&gt;&lt;a title="Learning Parallel Programming --- from shared-memory multi-threading to" href="http://www.pluralsight.com/community/blogs/drjoe/archive/2008/08/18/learning-parallel-programming-from-shared-memory-multi-threading-to-distributed-memory-multi-processing.aspx"&gt;Learning Parallel Programming --- from shared-memory multi-threading to distributed-memory multi-processing&lt;/a&gt;  &lt;h3&gt;Enlaces adicionales&lt;/h3&gt; &lt;p&gt;Si quieren explorar las posibilidades de programación de HPC, hay algunos temas a investigar:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;HPC&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.hpccommunity.org/"&gt;http://www.hpccommunity.org/&lt;/a&gt;&amp;nbsp;Comunidad HPC&lt;br /&gt;&lt;a title="http://www.hpcwire.com/" href="http://www.hpcwire.com/"&gt;http://www.hpcwire.com/&lt;/a&gt;&amp;nbsp;High Productivity Computing&lt;br /&gt;&lt;a href="http://www.ddj.com/hpc-high-performance-computing/"&gt;http://www.ddj.com/hpc-high-performance-computing/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=zTIKUxO9kf4&amp;amp;feature=user"&gt;YouTube - An Overview of High Performance Computing and Challenges for the Future&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/High-performance_computing"&gt;http://en.wikipedia.org/wiki/High-performance_computing&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;MPI&lt;/strong&gt;  &lt;p&gt;MPI (Message Passing Interface) está soportado en Windows HPC. Hay una implementación de Microsoft:  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb524831(VS.85).aspx"&gt;Microsoft MPI (Windows)&lt;/a&gt;  &lt;p&gt;que puede ser invocada desde C++.  &lt;p&gt;Hay una implementacíón&amp;nbsp;.NET sobre esa de&amp;nbsp;Microsoft MPI:  &lt;p&gt;&lt;a href="http://www.osl.iu.edu/research/mpi.net/"&gt;MPI.NET: High-Performance C# Library for Message Passing&lt;/a&gt;  &lt;p&gt;Tiene código fuente de ejemplo.  &lt;p&gt;(una anterior implementación en Codeplex:&amp;nbsp; &lt;a href="http://www.codeplex.com/mpinet"&gt;MPI .Net - Home&lt;/a&gt;)  &lt;p&gt;Ya había escrito sobre otra implementación en .NET:  &lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2008/04/15/message-passing-interface-ccr-dss-and-pure-mpinet/" target="_blank"&gt;MPI Message Passing Interface in .NET&lt;/a&gt;  &lt;p&gt;Más sobre&amp;nbsp;MPI  &lt;p&gt;&lt;a href="http://www.mpi-forum.org/docs/mpi2-report.pdf"&gt;MPI 2.0 Report&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lam-mpi.org/tutorials/"&gt;MPI Tutorials&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Messaging_Passing_Interface"&gt;Microsoft Messaging Passing Interface - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.purempi.net/"&gt;Pure Mpi.NET&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Programación en paralelo&lt;/strong&gt;  &lt;p&gt;&lt;a href="https://computing.llnl.gov/tutorials/parallel_comp/" target="_blank"&gt;Introduction to Parallel Computing&lt;/a&gt; introducción muy completa (gracias a&amp;nbsp;&lt;a href="http://blogs.southworks.net/jgarcia/" target="_blank"&gt;jgarcia&lt;/a&gt;&amp;nbsp;por el enlace)&lt;br /&gt;&lt;a href="http://research.microsoft.com/aboutmsr/labs/asia/innovationday_2008/ScienceFair.aspx"&gt;Microsoft Innovation Day - November 5, 2006&lt;/a&gt; están presentando algo relacionado con DryadLINQ&lt;br /&gt;&lt;a href="http://thevalerios.net/matt/2008/06/multithreading-and-concurrency-in-net/"&gt;Multithreading and Concurrency in .NET&lt;/a&gt;&amp;nbsp;una lista completa de tecnologías disponibles en .NET&lt;br /&gt;&lt;a title="http://www.microsoft.com/ccrdss" href="http://www.microsoft.com/ccrdss"&gt;http://www.microsoft.com/ccrdss&lt;/a&gt;&amp;nbsp;Ahora, CCR/DSS como paquete separado (antes venían sólo en Microsoft Robotics) &lt;br /&gt;&lt;a href="http://safari.adobepress.com/9780321603944"&gt;Adobe Press - 9780321603944 - Software Pipelines: The Key to Capitalizing on the Multi-core Revolution&lt;/a&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/Burton-Smith-On-General-Purpose-Super-Computing-and-the-History-and-Future-of-Parallelism/"&gt;Burton Smith: On General Purpose Super Computing and the History and Future of Parallelism | Going Deep | Channel 9&lt;/a&gt;&lt;br /&gt;&lt;a href="http://hadoop.apache.org/core/"&gt;Welcome to Hadoop!&lt;/a&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/research/sv/dryad/"&gt;Dryad - Home&lt;/a&gt;&amp;nbsp;Un interesante proyecto de&amp;nbsp;Microsoft research&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=WPhE5JCP2Ak"&gt;YouTube - Dryad: A general-purpose distributed execution platform&lt;/a&gt;&amp;nbsp;Presentación en Google Talks&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163744.aspx"&gt;Concurrency: What Every Dev Must Know About Multithreaded Apps&lt;/a&gt;&lt;br /&gt;&lt;a href="http://igoro.com/archive/overview-of-concurrency-in-net-framework-35/"&gt;Overview of concurrency in .NET Framework 3.5 | Igor Ostrovsky Blogging&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pfxteam/default.aspx"&gt;Parallel Programming with .NET&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/concurrency/default.aspx"&gt;Parallel Computing Developer Center&lt;/a&gt; de Microsoft&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Parallel_Virtual_Machine"&gt;Parallel Virtual Machine - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/10/PLINQ/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/07/10/PLINQ/default.aspx&lt;/a&gt; Parallel LINQ  &lt;p&gt;&lt;strong&gt;Map Reduce&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python"&gt;Writing An Hadoop MapReduce Program In Python&lt;/a&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/research/sv/dryad/eurosys07.pdf"&gt;Dryad: Distributed Data-Parallel Programs from Sequential Building Blocks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;Google Research Publication: MapReduce&lt;/a&gt;&lt;br /&gt; &lt;p&gt;&lt;strong&gt;Delicious&lt;/strong&gt;  &lt;p&gt;En mis enlaces en delicious sobre&amp;nbsp;HPC, MPI, Parallel programming, Grid Computing, algoritmos Map Reduce, CCR/DSS:  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/hpc"&gt;http://delicious.com/ajlopez/hpc&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/mpi"&gt;http://delicious.com/ajlopez/mpi&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/parallel"&gt;http://delicious.com/ajlopez/parallel&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/gridcomputing"&gt;http://delicious.com/ajlopez/gridcomputing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/mapreduce"&gt;http://delicious.com/ajlopez/mapreduce&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ccr"&gt;http://delicious.com/ajlopez/ccr&lt;/a&gt;&lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dss"&gt;http://delicious.com/ajlopez/dss&lt;/a&gt;  &lt;p&gt;En el PDC 2008, Windows HPC fue mostrado con un ejemplo de Computer Go, el programa campeón del mundo ManyFacesOfGo&amp;nbsp;(&lt;a href="http://www.smart-games.com"&gt;http://www.smart-games.com&lt;/a&gt;) . Computer Go es un tópico fascinante:  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/computergo"&gt;http://delicious.com/ajlopez/computergo&lt;/a&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=1653506" 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/Grid+Computing/default.aspx">Grid Computing</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/HPC/default.aspx">HPC</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx">High Performance Computing</category></item><item><title>Agentes Distribuidos y Fractales usando DSS/VPL</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/23/agentes-distribuidos-y-fractales-usando-dss-vpl.aspx</link><pubDate>Mon, 23 Jun 2008 17:11:37 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637058</guid><dc:creator>lopez</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1637058</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/23/agentes-distribuidos-y-fractales-usando-dss-vpl.aspx#comments</comments><description>&lt;p&gt;La semana pasada escribí una aplicación de base para agentes distribuidos usando DSS/VPL, agentes que intercambian mensajes arbitrarios e implementan un balanceo de carga rudimentario. Pueden leer los detalles en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx"&gt;Agentes Distribuidos usando DSS/VPL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ajlopez.wordpress.com/2008/06/15/distributed-agents-using-dssvpl/"&gt;Distributed Agents using&amp;nbsp;DSS/VPL &lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ayer, extendí el ejemplo con un nuevo proyecto, Fractal:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalsln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Pueden bajarlo desde &lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DSS/AjDssAgents-0.2.zip" target="_blank"&gt;mi Skydrive&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Tiene dos&amp;nbsp;DSS Service Components, uno es el&amp;nbsp;Calculator: calcula un sector del fractal de Mandelbrot. El otro componente es el Renderer, que tiene un formulario para controlar y mostrar los resultados del cálculo. El mensaje que transporta la información del sector a calcular es:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ed281842-4f1e-4878-87a4-5e9cc39d8478" 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;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; SectorInfo : MessagePayload
    {
        &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;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; RealMinimum { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; ImgMinimum { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Delta { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromX { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromY { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; MaxIterations { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; MaxValue { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&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;Otra clase es el mensaje que retorna el cálculo:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c23ce92b-efa1-4832-9743-2aeef1438dd2" 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;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Sector : MessagePayload
    {
        &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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromX { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromY { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&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;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] Values { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El Calculator divide el sector a calcular, si lo considera demasiado grade. Podría calcularlo en un solo paso, pero me parece interesante esta solución, para repartir el trabajo entre varios nodos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:685af1f9-0d83-445f-89c6-e9b39667d0b9" 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;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Calculate(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Calculator with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            SectorInfo sectorInfo &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (SectorInfo) msg.Payload;
            LogInfo(String.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;X {0} Y {1} Width {2} Height {3}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, sectorInfo.FromX, sectorInfo.FromY, sectorInfo.Width, sectorInfo.Height));

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (sectorInfo.Width &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; sectorInfo.Height &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                SplitSector(sectorInfo);
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                CalculateSector(sectorInfo);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como en el ejemplo de la semana pasada, podemos ejecutar este ejemplo desde un diagrama VPL, que se llama&amp;nbsp;FractalVpl1:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl1.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Acá hay un solo Renderer, y dos agentes Calculator. Si lanzamos este programa VPL, aparece una ventana. Esta es su apariencia (luego de presionar el botón Calculate):&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal2.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Podemos arrastrar el mouse para seleccionar una nueva región, o usar los botones de Zoom In y Zoom Out. El botón de Reset vuelve a la posición y colores iniciales. El botón Reset Colors vuelve a los colores iniciales, que pueden ser cambiados al azar con el botón New Colors.&lt;/p&gt;
&lt;p align="left"&gt;Hay otro programa VPL, llamado&amp;nbsp;FractalVpl2, que puede ser usado para ejecutar el mismo ejemplo de forma distribuida. Tiene un diagrama con dos AgentHosts:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl2d.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;y dos nodos:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl2n.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Debemos compilar el ejemplo VPL y pedir de ejecutar sus nodos en forma distribuida, usando el rundeployer.cmd (para más detalles, ver mi anterior post, mencionado al principio).&lt;/p&gt;
&lt;p align="left"&gt;Estos son algunos de los gráficos que produce el sistema:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal1.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal4.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal5.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;(Este post es una traducción del original en &amp;quot;Anglish&amp;quot;:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://ajlopez.wordpress.com/2008/06/22/distributed-agents-and-fractals-using-dssvpl/"&gt;Distributed Agents and Fractals using&amp;nbsp;DSS/VPL &lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;)&lt;/p&gt;
&lt;p align="left"&gt;Nos leemos!&lt;/p&gt;
&lt;p align="left"&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;p align="left"&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637058" 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/Grid+Computing/default.aspx">Grid Computing</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>Agentes Distribuidos usando DSS/VPL</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx</link><pubDate>Fri, 20 Jun 2008 10:44:33 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1636014</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=1636014</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx#comments</comments><description>&lt;p&gt;En este post, exploraremos algunas ideas para implementar agentes distribuidos, aprovechando las capacidades&amp;nbsp;que nos brindan&amp;nbsp;Decentrilized Software Services (DSS) y el Visual Programming Language (VPL), includos en el &lt;a href="http://www.microsoft.com/robotics" target="_blank"&gt;Microsoft Robotics Developer Studio&lt;/a&gt; (estoy trabajando con la versión CTP 2.0, con VS 2008). Pueden bajarse el código desde mi Skydrive:&lt;/p&gt; &lt;p&gt;&lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DSS/AjDssAgents-0.1.zip" target="_blank"&gt;AjDssAgents-0.1.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En un anterior post:&lt;/p&gt; &lt;p&gt;&lt;a title="Web Crawler example using DSS (Decentralized Software Services)" href="http://ajlopez.wordpress.com/2008/05/25/web-crawler-example-using-dss-decentralized-software-services/"&gt;Web Crawler example using DSS (Decentralized Software Services)&lt;/a&gt;&lt;br /&gt;&lt;a title="Ejemplo de Web Crawler usando DSS (Decentralized Software Services)" href="http://msmvps.com/blogs/lopez/archive/2008/05/28/ejemplo-de-web-crawler-usando-dss-decentralized-software-services.aspx"&gt;Ejemplo de Web Crawler usando DSS (Decentralized Software Services)&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;escribí algunos componentes DSS orquestados desde VPL, para implementar un web crawler. En ese ejemplo, hay un Dispatcher, un Resolver, un Downloader, y un&amp;nbsp;Harvester. Pueden leer ahí el detalle de sus funciones.&lt;/p&gt; &lt;p&gt;Pero supongamos que ahora tenemos varias máquinas para poder ejecutar el proceso de web crawling. Queremos instalar y ejecutar varios Downloaders y Harvesters, en una grilla de máquinas, usando load balancing automático. El problema con la orquestación desde VPL es que no soporta conceptos como load balancing, por lo menos no directamente. Entonces, escribí este ejemplo donde los componentes se comunican entre sí, como agentes, usando mensajes especiales.&lt;/p&gt; &lt;p&gt;Un agente, en este ejemplo, es un DSS service component, capaz de recibir y procesar mensajes que les envían los otros agentes. Puede enviar mensajes a otros componentes. En vez de indicar a cuál agente va dirigido un mensaje, se especifica el tipo lógico de agente al que va destinado, por ejemplo &amp;quot;WebCrawler/Harvester&amp;quot;.&lt;/p&gt; &lt;p&gt;Otro componente especializado, el AgentHost, se encargar de recibir esos mensajes a enviar, y los destina a un agente local o remoto, que corresponda al tipo lógico especificado.&lt;/p&gt; &lt;h3&gt;La solución&lt;/h3&gt; &lt;p&gt;La solución .NET tiene tres proyectos:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentssln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;AjDssAgents contiene el contrato genérico de un agente, y sus tipos, y la implementación concreta del AgentHost.&lt;/p&gt; &lt;p&gt;DecrementAgent and WebCrawler&amp;nbsp;son simples agentes a&amp;nbsp;usar en el ejemplo. El web crawler implementado es similar al&amp;nbsp;de mi anterior post, mencionado arriba.&lt;/p&gt; &lt;h3&gt;El mensaje&lt;/h3&gt; &lt;p&gt;Los agentes intercambian mensajes, objetos del tipo AgentMessage:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:19c1260f-0edf-49ad-9ea5-ce3fd1a35bb3" 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;
    [DataContract]
    &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;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage
    {
        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; From { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; To { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Action { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Payload { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&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;El campo From indica el origen del mensaje (no estoy usando ese campo todavía) El campo To es la dirección física (dirección DSSP) del agente destino, o su tipo lógico. En el ejemplo de este post, solamente estoy usando los tipos lógicos. ¿Por qué usar un tipo lógico? Así, si un mensaje tiene como To el valor &amp;quot;WebCrawler/Dispatcher&amp;quot;, será enviado a un agente que corresponda a ese tipo lógico.&lt;/p&gt;
&lt;p&gt;¿Cómo un agente conoce cuáles otros agentes están siendo ejecutados, y cuáles son sus tipos lógicos? Pues bien, no lo sabe. El componente que mantiene esa información es el AgenHost local, único en cada DssHost activo. Cada agente envía sus mensajes salientes a su AgentHost local, y éste los reenvía a los agentes locales o remotos apropiados.&lt;/p&gt;
&lt;h3&gt;Los agentes&lt;/h3&gt;
&lt;p&gt;Cada agente es un&amp;nbsp;DSS service component, con una dirección asignada cuando es creado. Durante el comienzo de su ejecucuón, el agente envía a su AgentHost local un mensaje DSS, indicando su dirección y su tipo lógico (p.ej. WebCrawler/Dispatcher). Esta es la forma por la que el AgentHost conoce los agentes que estan ejecutándose localmente, en su DssHost. Veamos el código de inicio de un agente Dispatcher del ejemplo WebCrawler:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f9d6b16-e418-434d-8269-c8c094c4e793" 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;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Start()
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Start();
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Add service specific initialization here.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            _state.AgentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;WebCrawler/Dispatcher&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

            host.NewNode newNode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.NewNode(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.AgentInfo() { Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ServiceInfo.Service, AgentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state.AgentType });
            _hostPort.Post(newNode);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El tipo del agente es mantenido en su estado.&lt;/p&gt;
&lt;p&gt;Este es un código típico, de un agente, en este caso un&amp;nbsp;Dispatcher, mostrando el tratamiento de un mensaje entrante y la producción de mensajes salientes:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:43d1f629-7d87-47b8-960c-1fc30002b3c2" 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;        [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerator&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ITask&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; PostMessageHandler(generic.PostMessage postMessage)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (postMessage.Body.Action.Equals(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dispatch&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
                Dispatch(postMessage.Body);
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (postMessage.Body.Action.Equals(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Resolve&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
                Resolve(postMessage.Body);

            postMessage.ResponsePort.Post(DefaultSubmitResponseType.Instance);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;yield&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dispatch(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Dispatcher with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;URL: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Payload);

            DownloadTarget target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DownloadTarget();

            target.Uri &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;) msg.Payload;
            target.Depth &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

            AgentMessage postmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage() { Action &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Resolve&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, To &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state.AgentType, Payload &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; target };
            host.PostMessage post &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.PostMessage(postmsg);
            _hostPort.Post(post);
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Resolve(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Dispatcher with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            DownloadTarget downloadtarget &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (DownloadTarget)msg.Payload;

            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;URL: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget.Uri &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Depth: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget.Depth);

            DownloadTarget target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessUrl(downloadtarget);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (target &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
                AgentMessage agentmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage() { To &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;WebCrawler/Downloader&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Action&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Download&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Payload &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget };
                host.PostMessage postmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.PostMessage(agentmsg);
                _hostPort.Post(postmsg);
            }
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;El AgentHost&lt;/h3&gt;
&lt;p&gt;Hay uno y sólo uno por DssHost en ejecución. El AgentHost recibe la información de los nuevos agentes que se crean (su dirección y tipo lógico), y mantiene esa información en su propio estado.&lt;/p&gt;
&lt;p&gt;Recibe mensajes de sus agentes locales, y los reenvía a otros agentes locales o a un AgentHost remoto. En este último caso, serializa el contenido del mensaje en un string, usando serialización XML (no podemos enviar un objeto genérico, debido a limitaciones en el Proxy que usa DSS). Esta es la estructura de un mensaje remoto:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a9815df5-5156-48a3-ba52-7c6468e48c46" 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;    [DataContract]
    &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;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; RemoteAgentMessage
    {
        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; From { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; To { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Action { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; PayloadTypeName { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &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;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Payload { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&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;Notemos que el mensaje remote tiene un string Payload, que es la serialización XML del&amp;nbsp;contenido original, y también tiene su tipo calificado, así el host destino podrá deserializarlo&amp;nbsp;a su tipo correspondiente al objeto original.&lt;/p&gt;
&lt;p&gt;Un AgentHost soporta subscripciones. Otros AgentHosts pueden subscribirse a recibir información de sus nuevos agentes. En general, si tenemos tres máquinas, debemos susbcribir a los tres AgentHosts entre ellos, así tendrán toda la información de los agentes que se encuentre corriendo, en las distintas máquinas.&lt;/p&gt;
&lt;h3&gt;Un ejemplo de Web Crawler con VPL&lt;/h3&gt;
&lt;p&gt;El ejemplo&amp;nbsp;WebCrawlerVpl2 en VPL contiene dos diagramas, el primero:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentsvpldiag.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Hay un Dispatcher, dos Downloaders y dos agentes&amp;nbsp;Harvesters. El Dispatcher lanza la URL inicial a procesar, y mantiene una lista de URLs ya procesadas. El Downloader obtiene el contenido de cada página en proceso. El Harvester examina el contenido y obtiene los nuevos links a procesar.&lt;/p&gt;
&lt;p&gt;Notemos que hay dos&amp;nbsp;AgentHosts, y&amp;nbsp;ellos se relacionan&amp;nbsp;por notificaciones para informar sus nuevos agentes al otro.&lt;/p&gt;
&lt;p&gt;Todos estos agentes y componentes se distribuyen en dos nodos:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentsvplnodes.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;El nodo Windows ejecutará en localhost:50000/50001, y el nodo&amp;nbsp;Windows0 usar localhost:50002/50003 como dirección. Podemos modificar estos parámetros, agregar más agentes y nodos, sin cambiar el código de la aplicación.&lt;/p&gt;
&lt;p&gt;Para ejecutar la distribución en forma distribuida, debemos compilarlar usando &lt;strong&gt;Build -&amp;gt; Compile as a Service&lt;/strong&gt; en el menú de VPL. Deberá cambiar las propiedades de VPL, ahora en el ejemplo están apuntando a directorios locales en mi máquina de desarrollo:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/dsslispvpl0.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Al compilar, VPL mostrará su avance:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentscompile.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Luego de la compilación, ir a la consola de DOS de MRDS, cambiar al directorio bin y lanzar el comando rundeployer.cmd:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentsrundpl.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Yo ejecuto el deployer en mi máquina local. Uds. pueden ejecutar el ejemplo en otras máquinas remotas, iniciando el deployer en cada una de ellas.&lt;/p&gt;
&lt;p align="left"&gt;Ahora, estamos listos para ejecutar el&amp;nbsp;web crawler. Seleccionamos&amp;nbsp;la opción&amp;nbsp;&lt;strong&gt;Run -&amp;gt; Run on distributed nodes&lt;/strong&gt; , y la aplicación comenzará a ejecutar. Un ventana de diálogo nos pedirár la URL inicial. La ingresamos, y el proceso comienza a recuperar las páginas de ese sitio. Pueden ver el estado del primer AgentHost (ejemplo) en:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://localhost:50000/agenthost"&gt;http://localhost:50000/agenthost&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagents50000.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Hay tres agentes locales y dos agentes remotos.&lt;/p&gt;
&lt;p align="left"&gt;En el otro DssHost, hay otro&amp;nbsp;AgentHost:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://localhost:50002/agenthost0"&gt;http://localhost:50002/agenthost0&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagents50002.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Vemos la diferencia: aquí hay dos nodos locales y tres remotos.&lt;/p&gt;
&lt;p align="left"&gt;Para ver el avance del proceso, pedir en el navegador&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://localhost:50000/console/output"&gt;http://localhost:50000/console/output&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentscon1.png" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Conclusiones&lt;/h3&gt;
&lt;p&gt;Con estas ideas, podemos implementar aplicaciones tipo grilla, ejecutándose en varios nodos físicos. Perdemos la orquestación de VPL, no podemos dibujar el camino de los mensajes. Pero ganamos en balanceo de carga y deploying dinámico. Con algo de esfuerzo adicional, podemos escribir un servicio que inicia e instale el sistema en una nueva máquina remota, en el medio de un proceso en ejecución. La serialización de objetos arbitrarios es posible, ahora está usando serialización XML, podemos cambiarla por serialización &amp;quot;custom&amp;quot; o binaria.&lt;/p&gt;
&lt;p&gt;Podría agregar subscripción a mensajes, en una futura versión. Un agente podría recibir mensajes que no estaban destinados a él, especificando algún criterio de subscripción. Esos criterios se mantendrían en los AgentHosts. Cuando un AgentHost rutea un mensaje saliente, podría reenviar una copia del mismo a cualquier agente interesando, ya sea local o remoto.&lt;/p&gt;
&lt;p&gt;Tienen la versión original de este post en &amp;quot;Anglish&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://ajlopez.wordpress.com/2008/06/15/distributed-agents-using-dssvpl" href="http://ajlopez.wordpress.com/2008/06/15/distributed-agents-using-dssvpl"&gt;http://ajlopez.wordpress.com/2008/06/15/distributed-agents-using-dssvpl&lt;/a&gt;&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/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=1636014" 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/Grid+Computing/default.aspx">Grid Computing</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>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>Message Passing Interface, CCR, DSS, y Pure MPI.NET</title><link>http://msmvps.com/blogs/lopez/archive/2008/04/16/message-passing-interface-ccr-dss-y-pure-mpi-net.aspx</link><pubDate>Wed, 16 Apr 2008 12:00:38 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1590382</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=1590382</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/04/16/message-passing-interface-ccr-dss-y-pure-mpi-net.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/mpi-clouds.jpg" align="left" alt="" /&gt; En estos días, estuve investigando algo sobre grid computing y Microsoft Robotics Studio, usando DSS y CCR. Encontré un interesante documento:&lt;/p&gt; &lt;p&gt;&lt;a href="http://grids.ucs.indiana.edu/ptliupages/publications/CCRSept23-07eScience07.pdf" target="_blank"&gt;High Performance Multi-Paradigm Messaging Runtime Integrating Grids and Multicore Systems&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Los autores son Xiaohong Qiu, Geoffrey C. Fox, Huapeng Yuan, Seung-Hee Bae, de la Indiana University de Bloomington, y George Chrysanthakopoulos, Henrik Frystyk Nielsen, de Microsoft Research. Nielsen y Chrysanthakopoulos son los &amp;quot;creadores&amp;quot; del Concurrency and Coordination Runtime (CCR) y de Decentralized Software Services (DSS), tecnologías que son pilares de Microsoft Robotics Studio, y que pueden ser usandas más allá de robótica. Más información sobre estas tecnologías en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/robotics"&gt;http://www.microsoft.com/robotics&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El &amp;quot;abstract&amp;quot; del documento dice:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;eScience applications need to use distributed Grid environments where each component is an individual or cluster of multicore machines. These are expected to have 64-128 cores 5 years from now and need to support scalable parallelism. Users will want to compose heterogeneous components into single jobs and run seamlessly in both distributed fashion and on a future “Grid on a chip” with different subsets of cores supporting individual components. We support this with a simple programming model made up of two layers supporting traditional parallel and Grid programming paradigms (workflow) respectively. We examine for a parallel clustering application, the Concurrency and Coordination Runtime CCR from Microsoft as a multi-paradigm runtime that integrates the two layers. Our work uses managed code (C#) and for AMD and Intel processors shows around a factor of 5 better performance than Java. CCR has MPI pattern and dynamic threading latencies of a few microseconds that are competitive with the performance of standard MPI for C.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;¿Que es&amp;nbsp;MPI? Son las siglas de &lt;a href="http://en.wikipedia.org/wiki/Message_Passing_Interface" target="_blank"&gt;Message Passing Interface&lt;/a&gt;. Según la Wikipedia:  &lt;blockquote&gt; &lt;p&gt;Message Passing Interface (MPI) is both a computer specification and is an implementation that allows many computers to communicate with one another. It is used in computer clusters.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Hay una There is a &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Messaging_Passing_Interface" target="_blank"&gt;implementación de Microsoft&lt;/a&gt;:  &lt;blockquote&gt; &lt;p&gt;Microsoft Message Passing Interface (MS MPI) is an implementation of the MPI2 specification by Microsoft for use in Windows Compute Cluster Server to interconnect and communicate (via messages) between High performance computing nodes. It is mostly compatible with the MPICH2 reference implementation, with some exceptions for job launch and management. MS MPI includes bindings for C and FORTRAN languages. It supports using the Microsoft Visual Studio for debugging purposes.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Gua! FORTRAN..... Esos buenos viejos días! ;-). Recuerdo haber trabajado con la implementación de Lisp en Fortran del bueno de &lt;a href="http://www.umcs.maine.edu/~chaitin/" target="_blank"&gt;Gregory Chaitin&lt;/a&gt;,&amp;nbsp;en el siglo pasado. Pero no hay vuelta atrás,&amp;nbsp;parafraseando a David Hilbert: Nadie nos expulsará del paraiso que&amp;nbsp;Java y .NET han creado para nosotros.... ;-). Pueden leer&amp;nbsp;&lt;a href="http://www.math.dartmouth.edu/~doyle/docs/heron/heron.txt" target="_blank"&gt;la cita original en este interesante thread&lt;/a&gt;.  &lt;p&gt;Pero estoy divagando. Volvamos al tema.  &lt;p&gt;Los principales sitios sobre MPI son:  &lt;p&gt;&lt;a title="http://www.mpi-forum.org/" href="http://www.mpi-forum.org/"&gt;http://www.mpi-forum.org/&lt;/a&gt;&lt;br /&gt;&lt;a title="http://www.open-mpi.org/" href="http://www.open-mpi.org/"&gt;http://www.open-mpi.org/&lt;/a&gt;&lt;br /&gt;&lt;a title="http://www.lam-mpi.org/" href="http://www.lam-mpi.org/"&gt;http://www.lam-mpi.org/&lt;/a&gt;  &lt;p&gt;Yo estaba pensando en implementar algo de las ideas de MPI en .NET o Java, cuando encuentro:  &lt;p&gt;&lt;a title="http://www.purempi.net/" href="http://www.purempi.net/"&gt;http://www.purempi.net/&lt;/a&gt;  &lt;blockquote&gt; &lt;p&gt;PureMpi.NET is a completely managed implementation of the message passing interface. The object-oriented API is simple, and easy to use for parallel programming. It has been developed based on the latest .NET technologies, including Windows Communication Foundation (WCF). This allows you to declaratively specify the binding and endpoint configuration for your environment, and performance needs. When using the SDK, a programmer will definitely see the MPI&amp;#39;ness of the interfaces come through, and will enjoy taking full advantage of .NET features - including generics, delegates, asynchronous results, exception handling, and extensibility points.  &lt;p&gt;PureMpi.NET allows you to create high performance production quality parallel systems, with all the benefits of in .NET&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Es una implementación lista para bajar y usar, con VS 2005 o VS 2008. Usa generics para implementar canales tipados en MPI.  &lt;p&gt;Me bajé la librería, y la instalé en una máquina con Visual Studio 2008. El programa de instalación agregó un nuevo template de proyecto, Mpi.NET:  &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/mpi01.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Cree un proyecto, que aparece:  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/mpi02.png" alt="" /&gt;  &lt;p&gt;Modifiqué el Program.cs a:  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5b94ab8a-28f3-46eb-91a4-045937a0e52d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:598px;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;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Linq;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Text;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; Mpi;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; Mpi.NET1
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Program
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
        {
            ProcessorGroup.Process(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;MPIEnvironment&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;delegate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(IDictionary&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Comm&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; comms)
                {
                    Comm comm &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; comms[&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;MPI_COMM_WORLD&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;];

                    Console.WriteLine(comm.Rank);

                    IAsyncResult result &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                        comm.BeginSend&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Rank: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; comm.Rank, TimeSpan.FromSeconds(&lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;), &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (comm.Rank &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                    {
                        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; comm.Size; i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                        {
                            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; receivedMsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                                comm.Receive&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(i, Constants.AnyTag, TimeSpan.FromSeconds(&lt;/span&gt;&lt;span style="color:#000000;"&gt;30&lt;/span&gt;&lt;span style="color:#000000;"&gt;));
                            Console.WriteLine(receivedMsg);
                        }
                    }
                    comm.EndSend&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(result);
                });
        }
    }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La clase &lt;strong&gt;ProcessGroup&lt;/strong&gt; se encarga de los procesos a ejecutar. Notar el uso de delegados para especificar el proceso. Un proceso MPI recibe un diccionario de objetos Comm, que son los canales para comunicarse con otros procesos MPI. 
&lt;p&gt;La clase &lt;strong&gt;ProcessGroup&lt;/strong&gt; tiene esta estructura (según la información de metadata): 
&lt;p&gt;&amp;nbsp; 
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:79126ab8-096c-4bf9-99d5-dad57d34ac2a" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:514px;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;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; Mpi
{
    &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;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessorGroup : IDisposable
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessorGroup(Environment environment, Processor processor);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessorGroup(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; environment, Processor processor);

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Environment Environment { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&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; ICollection&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;IAsyncResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Results { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&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;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dispose();
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dispose(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; disposing);
        &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;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Process(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; environmentConfigName, Processor processor);
        &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;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Start();
        &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;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; WaitForCompletion();
    }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;El número y configuración de procesadores puede ser definida en el archivo App.config:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d8dc3163-373e-4a7d-922a-2677dc58b9d0" 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;configuration&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;configSections&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;section &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.ConfigurationSection, Mpi&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;configSections&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;Mpi&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;Environments&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;Environment &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MPIEnvironment&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;Hosts&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;comms&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MPI_COMM_WORLD&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                service&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;comms&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MPI_COMM_WORLD&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient2&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                service&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService2&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;Host &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;comms&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MPI_COMM_WORLD&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                client&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient3&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
                service&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService3&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;Hosts&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;Environment&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;Environments&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;Mpi&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;system&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;.serviceModel&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;client&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8080/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
        bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient1&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;identity&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;userPrincipalName &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;identity&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;endpoint&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8081/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
        bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient2&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;identity&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;userPrincipalName &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;identity&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;endpoint&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8082/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
        bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiClient3&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;identity&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;userPrincipalName &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;identity&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;endpoint&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;client&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;behaviors&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;serviceBehaviors&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;behavior &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceBehavior&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;serviceDebug &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;httpHelpPageEnabled&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; httpsHelpPageEnabled&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
            includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;behavior&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;serviceBehaviors&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;behaviors&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;services&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;service &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceBehavior&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService1&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8080/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
          bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceEndpoint&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;service&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;service &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceBehavior&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService2&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8081/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
          bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceEndpoint&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;service&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;service &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceBehavior&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiService3&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;endpoint &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;net.tcp://localhost:8082/MpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; binding&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;netTcpBinding&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
          bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;MpiServiceEndpoint&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; contract&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Mpi.IMpiService&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &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;service&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;services&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;system.serviceModel&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;system&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;.runtime.serialization&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;dataContractSerializer&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;declaredTypes&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;declaredTypes&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;dataContractSerializer&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;system.runtime.serialization&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;configuration&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Jeje, usan &amp;lt;host..&amp;gt;...&amp;nbsp; Me recuerda a &lt;a href="http://ajlopez.wordpress.com/category/ajmessages/" target="_blank"&gt;AjMessages&lt;/a&gt;... ;-)&lt;/p&gt;
&lt;p&gt;La ejecución de programa produce:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/mpi03.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Bueno, no vamos a decir &amp;quot;Huy, que bruto que programa&amp;quot;, pero es mi primer programa MPI. Hay 3 &amp;quot;ranks&amp;quot;, porque así esta configurado en el archivo de arriba.&lt;/p&gt;
&lt;p&gt;Encontran varios ejemplos ejecutables en la distribución de Pure MPI.NET. En mi opinión, es una interesante implementación de ideas de MPI, con algunas vueltas de tuerca adaptadas al mundo .NET: generics y&amp;nbsp;delegates , bienvenidos.&lt;/p&gt;
&lt;p&gt;¿Grid y MPI? Puede ser. Tengo que estudiar las referencias mencionadas en el &amp;quot;paper&amp;quot; que nombré al principio. Aunque ese trabajo está dedicado a cuestiones de alto rendimiento, tiene un buen resumen conceptual de los modelos de ejecución, y las relaciones posibles entre MPI, CCR, y DSS.&lt;/p&gt;
&lt;p&gt;(Había publicado este artículo en &amp;quot;anglish&amp;quot;, Angel&amp;#39;s English, en:&lt;br /&gt;&lt;a href="http://ajlopez.wordpress.com/2008/04/15/message-passing-interface-ccr-dss-and-pure-mpinet/" target="_blank"&gt;Message Passing Interface, CCR, DSS, and Pure MPI.NET&lt;/a&gt;&lt;br /&gt;)&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=1590382" 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/Grid+Computing/default.aspx">Grid Computing</category></item><item><title>Más programando para una grid</title><link>http://msmvps.com/blogs/lopez/archive/2007/11/21/m-225-s-programando-para-una-grid.aspx</link><pubDate>Wed, 21 Nov 2007 10:13:49 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1344300</guid><dc:creator>lopez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1344300</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/11/21/m-225-s-programando-para-una-grid.aspx#comments</comments><description>&lt;p&gt;En el anterior post&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;p&gt;enumeré algunas aplicaciones que pueden aprovechar el concepto de grid computing, pensando en algunas aplicaciones para &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx" target="_blank"&gt;AjMessages&lt;/a&gt;, &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/20/agentes-usando-concurrency-and-coordination-runtime-ccr.aspx" target="_blank"&gt;AjAgents&lt;/a&gt; (o el venerable &lt;a href="http://msmvps.com/blogs/lopez/archive/2006/07/20/105318.aspx" target="_blank"&gt;AjServer&lt;/a&gt;): como siempre, esto es el AjLenguaje en el AjMundo... :-). Tengo una lista ampliada, para comentar.&lt;/p&gt; &lt;h3&gt;Más aplicaciones&lt;/h3&gt; &lt;p&gt;- &lt;strong&gt;Programas de Biología Molecular y Genética&lt;/strong&gt;: Tenía que revisar esta rama, (ver el curso de Sebastian Bassi y cía sobre &lt;strong&gt;&lt;a title="Charla Gratuita- Introducci&amp;oacute;n a la Biolog&amp;iacute;a Molecular para" href="http://msmvps.com/blogs/lopez/archive/2007/07/11/charla-gratuita-introducci-243-n-a-la-biolog-237-a-molecular-para-programadores.aspx"&gt;Introducción a la Biología Molecular para Programadores&lt;/a&gt;&lt;/strong&gt;), pero es interesante encontrar que hay implementaciones como &lt;a href="http://www.ncbi.nlm.nih.gov/blast/Blast.cgi" target="_blank"&gt;BLAST&lt;/a&gt; que bien podrían portarse a una grid. Vean alguna implementación de BLAST en grilla en &lt;a href="http://www.digipede.net/"&gt;Digipede&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Rendering y procesamiento de imágenes&lt;/strong&gt;: Mucho de los algoritmos de iluminación, reflejos, armado de imágenes realistas, pueden realizarse en paralelo. Tengo que revisar cuáles son&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Producción de animaciones&lt;/strong&gt;: Si una imagen, para su proceso, necesita un algoritmo no paralelizable, se puede usar cada nodo de la grilla para procesar una imagen, pero usar la grilla completa entonces para producir una serie de imágenes, que compondrán una animación.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Procesamiento de media&lt;/strong&gt;: tanto la compresión de video, como la detección de key frames, cambios de escena en un video, puede particionarse en nodos de una grilla.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Procesamiento ETL&lt;/strong&gt;: Extract, Transform y Load, un clásico del procesamiento &amp;quot;batch&amp;quot;, bien puede ser enviado paralelizado a una grid.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Detección de Spam&lt;/strong&gt;: Una empresa de distribución de listas de correo, como egrupos.net, bien podría derivar el análisis a una grilla. Tal vez es más una aplicación de computación distribuida, pero tanto &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/22/ajmessages-hacia-un-procesador-de-mensajes.aspx" target="_blank"&gt;AjMessages&lt;/a&gt; como &lt;a href="http://ajlopez.wordpress.com/2007/10/15/remember-fabriq/" target="_blank"&gt;Fabriq&lt;/a&gt; están ahí cerca: no son solo para explotar en una grilla.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Simulaciones&lt;/strong&gt;: un tema amplísimo. Hay sistemas donde no es fácil ver el resultado de dada una entrada, ver qué produce. Ante distintas entradas (por ejemplo, forma de un barco y velocidad), hay que calcular el resultado (resistencia, velocidad final, turbulencia). Hay que probar distintos conjuntos de entrada. Entonces, cada entrada (pueden ser miles) se puede ir entregar a un modelo simulado, ejecutando en un nodo. Con varios nodos, se simulan más resultados.&lt;/p&gt; &lt;h3&gt;Enlaces&lt;/h3&gt; &lt;p&gt;He coleccionado varios enlaces en el adictivo Delicious sobre Grid Computing&lt;/p&gt; &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; &lt;p&gt;Para este post, me he detenido más en&lt;/p&gt; &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;&lt;br /&gt;&lt;a title="http://www.gridgistics.net/" href="http://www.gridgistics.net/"&gt;http://www.gridgistics.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Es muy interesante la implementación de la gente de Digipede. Distribuyen assemblies, hay un servidor que recibe tareas, las distribuye en distintas máquinas donde corren los agentes Digipede, mantiene una base de datos con las tareas lanzadas y pendientes, y expone una interfaz web de control. Una aplicación de usuario puede comunicarse con el servidor Digipede, mediante un servicio web.&lt;/p&gt; &lt;p&gt;Lo interesante de GridGain es la &amp;quot;gridificación&amp;quot; de un método, usando Java annotations. Interesante idea a explorar.&lt;/p&gt; &lt;h3&gt;Algunas ideas locas&lt;/h3&gt; &lt;p&gt;Para que noten que todavía no pueden darme de alta en el nosocomio mental en el que estoy albergado, veamos:&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Generación de código en grilla&lt;/strong&gt;: Lo tenía para colocar en el anterior artículo, pero me olvidé. No solamente se puede paralelizar algo de generación de código, sino que creo que podemos montar distintos agentes expertos, que completen el modelo, &amp;quot;conozcan&amp;quot; de arquitectura y patrones, de code coverage, de unit tests, y que vayan colaborando, generando artefactos finales e intermedios, armando una &amp;quot;pipeline&amp;quot; de producción de código, o trabajando en paralelo. Siempre pensando que esos agentes pueden estar en una grilla.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Computer Go en grilla&lt;/strong&gt;: Ya hay algunos trabajos hechos con GNUGo. Pero sería interesante poder armar que el AjGo tenga una organización interna basada en un concepto de agentes (como tantas palabras, agente es un concepto difuso, disculpen la ambigüedad). Algo presenté de la idea este año, en el Congreso de Go que se realizó aquí en&amp;nbsp;Argentina.&amp;nbsp;Habría agentes especializados en resolver problemas concretos (invasión de territorio, reduccion de territorio, formación de ojos, impedir formar ojos, escape de grupo, etc ...) que bien pueden ejecutarse en una grilla. Eso permitirá un &amp;quot;scale out&amp;quot; interesante, en cuanto se complique obtener respuestas en tiempo razonable, debido a la naturaleza del juego.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Lenguaje de programación &amp;quot;grillable&amp;quot;&lt;/strong&gt;: Tal vez debería comenzar con solamente tener un lenguaje de programación con ejecución en paralelo o diferida. Tengo ideas para extender AjBasic con CCR o similar (tengo algo diseñado, no publicado ni bajado a código, con lazy evaluation en paralelo), o de implementar algo más orientado a programación funcional, donde algun operador (se me ocurre procesamiento de listas y otros) sea &amp;quot;grillable&amp;quot;: pueda delegarse el trabajo en paralelo a una grilla, que puede existir o no, o que puede ser ampliada en caso de ser necesario para el resultado a tiempo del algoritmo empleado. Sería interesante tener un lenguaje así: que funcione en una sola máquina, pero que transparentemente, pueda&amp;nbsp;colocarse en una grilla, siga funcionando igual, pero obtenga toda la ventaja de tener una grid abajo. Se viene el AjG#... ;-)&lt;/p&gt; &lt;h3&gt;Conclusión y Agradecimiento&lt;/h3&gt; &lt;p&gt;Creo que es un tema interesantísimo. Agradezco desde acá al bueno de &lt;a href="http://staff.southworks.net/gabrielsz" target="_blank"&gt;Gabriel Szlechtman&lt;/a&gt; (confieso que tuve que copiar el apellido, todavía no me lo aprendo), que sugirió lo de procesamiento de media, algo de generación de código (tomado de sus ideas de generador de código), detección de spam, y otros.&lt;/p&gt; &lt;p&gt;¿Conocen otras aplicaciones, implementaciones, para comentar?&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=1344300" 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/Grid+Computing/default.aspx">Grid Computing</category></item><item><title>Programando para una Grid</title><link>http://msmvps.com/blogs/lopez/archive/2007/11/15/programando-para-una-grid.aspx</link><pubDate>Thu, 15 Nov 2007 15:04:03 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1315513</guid><dc:creator>lopez</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1315513</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/11/15/programando-para-una-grid.aspx#comments</comments><description>&lt;p&gt;En anteriores posts, comenté sobre los proyectos AjMessages y AjAgents:&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;&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;p&gt;Una de las capacidades que tiene AjMessages es comunicar distintas instancias del programa, que pueden ejecutar en diferentes máquinas servidoras. Se le pueden enviar mensajes de configuración dinámica, lo que permite que a cada máquina se le pueda dar un trabajo distinto. También puede configurarse para que una acción (elemento mínimo direccionable dentro de una aplicación AjMessages) pueda ser atendida en distintas máquinas. AjAgents apunta a que también en algún momento tenga agentes distribuidos, pero por ahora es una aplicación local.&lt;/p&gt; &lt;p&gt;AjMessages se podría distribuir de forma que un servidor pueda controlar otras instancias del sistema:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/grid01.jpg" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Quisiera enumerar aquí algunas de los escenarios de uso de un sistema que pueda ejecutar en una grilla de servidores, lo que se llama Grid Computing. Como toda &amp;quot;buzzword&amp;quot; tecnológica, puede tener un alcance amplio, pero tratemos de definirla.&lt;/p&gt; &lt;p&gt;Según el excelente artículo introductorio de la gente de IBM:&lt;/p&gt; &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;p&gt;Grid Computing permite unir un pool de servidores, sistemas de almacenamiento, y redes, en un gran sistema único, de manera que podamos manejar todos esos recursos múltiples a una tarea. Para el usuario, o la aplicación, el sistema aparece como un gran sistema único de computación.&lt;/p&gt; &lt;p&gt;En el caso de AjMessage, siguiendo las ideas de Fabriq, ese efecto se consigue porque los distintos servidores ejecutan una o varias aplicaciones, y sus acciones, de manera transparente.&lt;/p&gt; &lt;p&gt;El concepto de Grid Computing permite obtener mayor capacidad de procesamiento, sin necesidad de tener un gran sistema de hardware o software, sino apelando a repartir la carga y distribuyendo la tarea entre máquinas de línea. Dependiendo del sistema que organice esa distribución, podemos agregar más máquinas, obteniendo mejores resultados, sin necesidad de cambiar la aplicación.&lt;/p&gt; &lt;p&gt;Imaginen que podemos tener un conjunto de servidores, formando una grilla, y brindar ese conjunto a los usuarios que lo necesiten, para en algún momento resolver alguna tarea. Me imagino un Grid as a Service, que seguramente alguien ya está implementando.&lt;/p&gt; &lt;p&gt;Pero concentrémonos hoy en el tema: ¿qué casos de uso, escenarios, podemos imaginar para usar una grid?&lt;/p&gt; &lt;p&gt;He aquí la lista que estuve confeccionando:&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Resolución de algoritmos genéticos&lt;/strong&gt;: Un problema que tal vez no tenga un algoritmo normal de resolución, o cuya complejidad crezca con su tamaño de forma exponencial, puede llegar a ser un reto siguiendo procedimientos tradicionales. Con algoritmos genéticos, podemos ir probando soluciones parciales, y mediante cambio y selección, ir descubriendo mejores soluciones. Es claro que eso se puede hacer en paralelo, siendo ideal para ser dado como tarea a una grid. Me gustaría procesar algo como lo de &lt;a href="http://www.darwinathome.org"&gt;http://www.darwinathome.org&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Búsqueda en árbol&lt;/strong&gt;: en muchos problemas de inteligencia artificial, es necesario explorar ramas en un árbol de búsqueda. Uno de los casos donde se aplica, es en el análisis de jugadas de un juego, pero también en decisiones de negocio y planeamiento. Me imagino una grilla colaborando en la decisión de la próxima jugada en un juego de Go, uno de los problemas difíciles de la inteligencia artificial actual, ver ....)&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Araña e indexador en la web&lt;/strong&gt;: la tarea de examinar un sitio, tomar el contenidos de sus páginas, analizarlas, detectar enlaces, y seguir explorando a partir de ellos, es una tarea que bien puede ser repartida. Mientras un nodo consigue el contenido de otra página, va generando tareas para otros nodos, como analizar las páginas enlazadas desde la actual en proceso.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Trabajo en lote&lt;/strong&gt;: podría darse a una red el trabajo de procesar gran cantidad de información que sea &amp;quot;partible&amp;quot;, desde transformaciones de una tabla de base de datos, hasta análisis de logs para generar estadísticas. Si la entrada es divisible, el proceso de cada parte puede ser enviado a un nodo distinto. Por ejemplo, un nodo se puede ocupar de transformar los datos de una tabla de transacciones, pero sólo los de enero, mientras que otro se ocupa de procesar los de otro mes&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Distribución de listas de correo electrónico&lt;/strong&gt;: Un caso típico, si somos una empresa que brinda este servicio, al llegar un correo electrónico destinado a una lista que mantenemos, delegamos el envío de cada email en particular, con personalización incluida por ejemplo, a nodos de la grilla.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Procesamiento de mensajes&lt;/strong&gt;: Podemos necesitar recibir mensajes XML, y aplicarle transformaciones, o en base a su contenido, derivarlos a un proceso u otro. Las transformaciones y controles se los podemos deriva a nodos de la grilla. Si aumenta el caudal de mensajes entrantes, simplemente aumentamos la cantidad de nodos de procesamiento.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Ejecución de un workflow&lt;/strong&gt;: Siguiendo con la generalización, podemos diseñar un flujo de trabajo, cada uno de sus pasos puede ejecutarse en nodos diferentes. Habrá nodos que puedan ejecutar más de un paso, y habrá pasos de toma de decisiones. Me imagino como caso concreto, la ejecución de todos los pasos ante un nuevo tenant, en un sistema encargado de provisioning de un sistema brindado como Software as a Service.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Map Reduce&lt;/strong&gt;: Es un modelo de programación para procesar grandes conjuntos de datos. Se especifica una función Map que procesa un par clave/valor de entrada, genera pares clave/valor intermedios, en general varios. Hay otra función Reduce que se aplica a todos los pares clave/valor intermedios que compartan la misma clave. Por ejemplo, una función Map puede recibir un documento a procesar, genera pares palabra/documento por cada palabra relevante que encuentre, y la función Reduce toma esos pares de una misma palabra, para generar una lista de documentos que contengan a esa palabra. Para una explicación más detallada, ver un &amp;quot;paper&amp;quot; de &lt;a href="http://labs.google.com/" target="_blank"&gt;Google Labs&lt;/a&gt; MapReduce: &lt;a href="http://labs.google.com/papers/mapreduce-osdi04.pdf"&gt;Simplified Data Processing on Large Clusters&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Creo que hay varias implementaciones de estos escenarios en grillas y otras soluciones. Me gustaría armar una prueba de concepto, usando el AjMessages o similar&amp;nbsp;como base.&lt;/p&gt; &lt;p&gt;Cambiando la óptica, se puede pensar en exponer la grilla con uno o varios web services, e implementar alguna forma de poder &amp;quot;sembrar&amp;quot; trabajos desde otros sistemas en la grilla. Se me ocurre sembrar:&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Assemblies completos&lt;/strong&gt;, e invocación de algunos métodos en clases y objetos a determinar.&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Programas en lenguajes de scripting&lt;/strong&gt;, controlados por razones de seguridad&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Agentes&lt;/strong&gt;, que pueden consistir en assemblies o en código para una máquina virtual de agentes&lt;/p&gt; &lt;p&gt;- &lt;strong&gt;Programas escritos en DSLs&lt;/strong&gt; Domain Specific Language, uno o varios lenguajes que algunos nodos de la grilla entiendan.&lt;/p&gt; &lt;p&gt;Semejante grilla se puede brindar como servicio a otros sistemas. Surge el concepto de Grid as a Service, el alquiler de su consumo, el control del nivel de servicio, y demás, que algún software de control deberá proveer.&lt;/p&gt; &lt;p&gt;Ya escribiré en particular sobre Grid Computing, por ahora puede consultar el ya mencionado artículo de IBM:&lt;/p&gt; &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;p&gt;y una interesante implementación de código abierto en Java:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.gridgain.com/" target="_blank"&gt;GridGain&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(El gráfico del comienzo de este artículo está &amp;quot;inspirado&amp;quot; en uno de GridGain, pero los nodos se pueden comunicar entre sí, y repartir su trabajo, siguiendo la indepedencia de localización de cada acción en AjMessage).&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=1315513" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category></item></channel></rss>