viernes, 30 de marzo de 2007

patterns in action ;)

De nuevo dando lata!!

Hace unas semanas llegando al trabajo enciendo mi compu y veo un correo en donde me indican que una de las interfaces que recibe dictamenes y los envia a un sistema medico NO estaba funcionando... tranquilamente entro al solaris y al ver el log... oh sorpresa!! .. mis threads estaban atorados y un alegre conjunto de mensajes me decia:

Mar 15, 2007 8:44:02 AM CST Error WebLogicServer BEA-000337 ExecuteThread: '14' for queue: 'weblogic.kernel.Default' has been busy fo
r "657" seconds working on the request "Http Request: /WSRecibeST1/recepcionST1.jws"

.. a lo que tranquilamente me di a la tarea de reiniciar mi servidor pensando que con eso se resolveria el problema y una vez levantado revisar que fue lo que paso... je je je ¡oh sorpresa! los alegres mensajes de mis threads seguian saliendo.... y pense "Pus si mi interfaz ha estado operando en casi un año sin problemas..." asi es Tuzo, pero no con el volumen que mandaron esos dias..

El diseño estaba de la siguiente manera:



... el proceso de envío de dictamenes envía un mensaje XML en formato HL7, el servicio de integracion transforma el Xml a un formato de Java y lo envia al endpoint del servicio RMI, ¿sencillo no?, en efecto pero con lo que no contaba, es que RMI necesita dos threads para procesar una peticion.. es decir por un thread atiende y en otro responde.. por lo que en el momento que me mandaron carga, mis threads de ejecucion se terminaron (tenía 15 :D) y RMI no me regresaba la respuesta hasta que no existiera un thread disponible.... asi que entre en un deadlock..

.. pues de alguna manera teniamos que resolver el problema: controlar el numero de peticiones al servicio RMI.

Revisando el libro Enterprise Integration Patterns, se encuentra un patron llamado Competing Consumers, pensando en aplicar este patron para controlar el numero de threds que envia datos al servicio RMI, nos empezo a llegar la luz.

Gustavo y su servilleta pensamos en utilizar la solucion de Aqualogic Service Bus para este caso.... buscando en la documentacion de ALSB encontramos dos cosas A) el patron throttling pattern que permite controlar el grado de concurrencia y B) el concepto WorkManager que define restricciones de carga en threads, asi que nos pusimos manos a la obra y juntando lo anterior mas unas cuantas colas JMS, el resultado quedo en lo siguiente:



... el servicio envia el mensaje a un proxy service, este lo almacena en una cola JMS y libera la conexion, posteriomente un suscriptor consume (de uno en uno) y ejecuta un business service que se encarga de enviar (uno a uno) a la interfaz del EAI para que esta envíe finalmente al servicio RMI. Para garantizar que nuestra solucion funcionaria en produccion, usamos jmeter para enviar 600 mensajes y respondio sin problemas, enviando todos los mensajes en 1 minuto al servicio final.. como veran, con esta solucion es posible controlar el numero de peticiones al servicio final mediante los WorkManagers.

Tambien pueden aplicar el patron Competing Consumers y tendrian el mismo efecto, en algun momento les comentare como este patron nos resolvio un problema al conectarnos con servicios Mainframe.

Pues esta fue la solucion aplicada..

Comentarios y sugerencias son bienvenidos.

Por una integracion mejor, hasta la vista

Tuzo

jueves, 29 de marzo de 2007

ESB or not ESB?

Hola que tal! aqui de nuevo dando lata :D

ESB or not ESB? jejeje, pues si efectivamente navegando por la red me he encontrado con algunas discusiones acerca de la definicion de un ESB y pues me motivo a escribir este post... espero os sirva...

Bien, pues el concepto de Enterprise Service Bus surge en Gartner en colaboracion con David Chapell (tipo con el cual tuvimos una platica en el 2006). Actualmente el termino ESB es muy nombrado por sistemologos, peeroooo ¿realmente conocemos que es un ESB?

En terminos practicos un ESB es una implementacion de SOA, en palabras cristianas es: conectar un cliente y un proveedor mediante un middleware... veamos a mas detalle

Para entender que es un ESB, es necesario saber primeramente que es lo que hace. La manera en que me "cayo el veinte" es entendiendo el patron de integracion VETRO pattern, culaquier software o hardware que se diga ser un ESB, al menos debe de cumplir con este patron, como Jack el destripador vayamos por partes.....

Validation: Se encarga de realizar la validacion de mensajes que entran al ESB, esta validacion es generalmente basada en estandares, por ejemplo validar el XML de entrada contra su respectivo XSD

Enrichment: Esta parte es la encargada de enriquecer el mensaje inicial del cliente con informacion necesaria para la invocacion del servicio final. En la mayoria de las ocasiones este enriquecimiento es generado en llamadas a servicios de negocio y adicionando informacion al mensaje

Transformation: Esta parte es la encargada de transformar el mensaje original a otro formato que sea necesario por el servicio final, por ejemplo utilizar Xquery para trasformaciones entre archivos XML

Routing: Esta parte es muy interesante, es la encargada de rutear el mensaje a diferentes servicios de acuerdo al contenido o a la operacion o inclusive se pueden tener tablas de ruteo

Operate: Es la parte final, la que se encarga de comunicarse con el servicio final, es decir se conecta con los servicios de negocio.

Adicional a el patron VETRO agregare unos puntos harto importantes:

+ Un ESB es distribuido, es decir no es el clasico hub and spoke, un ESB se puede distribuir en toda la red fisica.
+ Esta basado en un sistema de mensajeria o Message Oriented Middleware, lo cual permite manejar muchos escenarios de manera asincrona.
+ Permite el monitoreo de niveles de servicio de cada uno de los servicios pertenecientes al ESB
+ Permite controlar la calidad de servicio y la calidad de proteccion

Actualmente existen una cantidad considerable de ESB de "marca" y open source, aqui una lista

+ Sonic MQ
+ BEA Aqualogic Service Bus, es el que usamos aqui en el trabajo :D
+ Mule ESB, tambien existente en nuestra arquitectura :D
+ IONA Celtix ESB
+ Apache ServiceMix

Para finalizar quiero compartir con ustedes este podcast de Mark Richards Senior IT architect de IBM, titulado The Enterprise Service Bus: Do We Really Need It?, espero les guste, si no jala el link me dicen, :D

Bueno pues es todo, si me falto algo bienvenido...

Por una integracion mejor, hasta la vista

Tuzo