miércoles, 30 de abril de 2014

WSO2 y su propuesta para el gobierno electrónico

Los temas de gobierno electrónico están muy de moda hoy vinculados a los siguientes tópicos:
  1. SOA.
  2. BPM.
  3. Cloud Computing.
  4. Big Data.
Esta relación se hace bastante “interesante” cuando desde el punto tecnológico las arquitecturas propuestas se pueden instanciar usando una suite como la de WSO2, que abarca cada uno de los puntos anteriores a través de un conjunto de herramientas libres bajo licencia Apache 2.0.

Fig.1. Ejemplo de la relación entre el gobierno electrónico y la computación en la nube


Desde WSO2 nos presentaron un artículo titulado: “Connected Government Cloud Enabling Public Services. The Importance of Functional and Nonfunctional Requirements in Building a Multi-tenanted Digital Government Stack” en el cual nos llevan a un enfoque basado en 3 modelos diferentes que combinan la Computación en la Nube con el Gobierno electrónico.

Estos modelos son:

  • Controlado y gobernado centralmente: Los sistemas son controlados centralmente lo que implica que se provee un modelo SaaS a los gobiernos locales y además las políticas son aplicadas a nivel nacional y aplicadas a nivel local.
  • Controlado centralmente pero gobernado localmente: en este caso aplica lo mismo del modelo anterior donde el gobierno central brinda un modelo SaaS a los gobiernos locales, pero este último puede desplegar y aplicar sus políticas encima del SaaS.
  • Controlado y gobernado localmente: en este caso el gobierno central no juega un papel importante ya que los sistemas son desplegados a nivel local y el hosting y la infraestructura es gobernada por el propio gobierno local.

Para más información sobre las ventajas y desventajas de cada modelo así como el macheo entre un tipo de gobierno el tipo de modelo a aplicar pueden consultar el artículo en cuestión.

El artículo nos propone como se podría ver una solución de arquitectura para el gobierno electrónico usando los componentes de su suite.


lunes, 7 de abril de 2014

MULE vs WSO2 en el patrón de integración Scatter-Gather.

Hace unos días revisando el blog de MULE me topé con esta entrada del 3/04/2014 donde se explica como con la nueva versión 3.5 se ha añadido una funcionalidad para eliminar algunos problemas de las versiones anteriores a la hora de implementar el patrón de integración "Scatter-Gather".

Este patrón define la forma de enviar un mismo mensaje a diferentes destinos con un objetivo determinado y luego procesar la respuesta de una manera específica, tal como pueden ver en la imagen siguiente.




Un objetivo que nos llevaría a implementar este patrón puede ser el mandar un mismo request a diferentes sistemas que se encargan de procesar reservaciones de vuelos y a partir de la respuesta recibida de cada uno seleccionar la mejor para la solución final, tanto los ejemplos de MULE como de WSO2 seleccionan de las respuestas recibidas la más barata. Es solo un ejemplo pero les puede dar idea de la utilidad del patrón.

MULE antes de la versión 3.5 implementaba este patrón usando un router multicasting <all>, el cual presentaba las siguientes limitantes según se comenta en el propio artículo:
  1. Procesamiento en secuencia, o sea uno detrás del otro.
  2. Problemas en el manejo de los errores.
  3. Poca personalización de la solución para adecuarla a las necesidades específicas de los desarrolladores.
En la entrada que les comentaba con la introducción del router <scatter-gather> le han dado solución a estos problemas.

Lo interesante es que MULE hace esto ahora, pero WSO2 lo tiene hecho desde hace un tiempo ya y no con un mediador si no con la combinación de varios mediadores, lo que implica que la solución aunque parezca un poco más complicada técnicamente permite una mayor personalización para los desarrolladores. Y creo que esto es genial, el tener pequeños bloques de construcción que puedan ser usados para casi cualquier cosa y pienso que esa es la idea de WSO2. Si a esto le sumamos que podemos crear templates a partir de una solución en particular y luego usar dicho template para recrear una nueva implementación del patrón, pues nos ahorramos mucha configuración.
Solo les dejo el XML del servicio proxy para que lo vean:


<proxy xmlns="http://ws.apache.org/ns/synapse" name="ScatterGatherProxy" transports="https http" startOnLoad="true" trace="disable">  
    <description/>  
    <target>  
        <inSequence>  
            <clone>  
                <target>  
                    <endpoint name="vendorA">  
                        <address uri="http://localhost:9000/services/SimpleStockQuoteService/"/>  
                    </endpoint>  
                </target>  
                <target>  
                    <endpoint name="vendorB">  
                        <address uri="http://localhost:9001/services/SimpleStockQuoteService/"/>  
                    </endpoint>  
                </target>  
                <target>  
                    <endpoint name="vendorC">  
                        <address uri="http://localhost:9002/services/SimpleStockQuoteService/"/>  
                    </endpoint>  
                </target>  
            </clone>  
        </inSequence>  
        <outSequence>  
            <log level="full"/>  
            <aggregate>  
                <completeCondition>  
                    <messageCount min="3"/>  
                </completeCondition>  
                <onComplete xmlns:m1="http://services.samples/xsd" xmlns:m0="http://services.samples" expression="//m0:return">  
                    <enrich>  
                        <source xmlns:m1="http://services.samples/xsd" clone="true" xpath="//m0:return[not(preceding-sibling::m0:return/m1:last <= m1:last) and not(following-sibling::m0:return/m1:last < m1:last)]"/>  
                        <target type="body"/>  
                    </enrich>  
                    <send/>  
                </onComplete>  
            </aggregate>  
        </outSequence>  
    </target>  
</proxy>


La solución que propone WSO2 para este patrón la pueden encontrar en este enlace muy bien documentada y lista para ser probada con un paso a paso, así que no la recrearé en esta entrada.