domingo, 18 de octubre de 2015

PROCESOS PARALELOS CON 'SPLIT-JOIN'


Los procesos paralelos son muy importantes en todo flujo de tareas, así mismo en 'Oracle Service Bus 12c' (desde ahora OSB) este tratamiento también es utilizado en la mediación, debido a que es una buena práctica, ya que son mucho más ágiles y rápidos que los procesos secuenciales comúnmente usados.

OSB ofrece el manejo de este tipo de procesos por medio de su colección nodos, pero lastimosamente este manejo en paralelo no es muy utilizado comúnmente en los diferentes proyectos. OSB brinda lo que se conoce como Split-Join (Para los procesos PARALELOS) y Pipeline (Para los proceso SECUENCIALES). Así mismo, Split-Join proviene de un patrón que es SPLITTER este patrón consiste en dividir los mensajes grandes en muchos mensajes más pequeños y ser manejados todos estos en paralelo y por medio de JOIN, se vuelven a unir. Es importante mencionar que para el tratamiento en paralelo se debe antes que nada verificar que las tareas que se irán a poder en paralelo NO tengan dependencia alguna entre ellas.



En esta oportunidad mostraré como crear dicho Split-Join, con el objetivo de exponer dos servicios virtuales: DatosClienteService.wsdl y DeudaClienteService.wsdl, por medio de un SOAP-UI MockServices, dichos servicios simularan los posibles servicios creados en BPEL. Estos servicios serán virtualizado por medio de OSB y con los mismo .wsdls se generarán nuevas URLs propias del OSB. Estos Servicios Virtualizados son parte del proyecto: ExternalService (estos dos serán los servicios que se utilizarán en el posterior proceso en paralelo). Luego, se ha creado un proyecto: InternalService, en el cual se expondrá el servicio compuesto de tipo: Split-Join, que procesará los mensajes de cada Servicio Virtual (por medio de los: BusinessService's), y posteriormente integrará los mensajes de ambas respuestas en una sola respuesta final.

Los detalles de los recursos trabajados son:


Servicio Virtual #1:
http://localhost:7101/ExternalService/ClienteService/Pipelines/DatosClienteWS?wsdl

SOAP-UI (Mock#1):
DatosClienteService => DatosClienteService.wsdl 
http://localhost:8090/mockDatosClienteService?wsdl



Servicio Virtual #2:
http://localhost:7101/ExternalService/ClienteService/Pipelines/DeudaClienteWS?wsdl

SOAP-UI (Mock#2):        
DeudaClienteService => DeudaClienteService.wsdl   
http://localhost:8091/mockDeudaClienteService?wsdl   



Servicio Principal (Split-Join):
http://localhost:7101/InternalService/ClienteService/SplitJoin/InfoClienteWS?wsdl


Tal como se mencionó anteriormente, primero se debe de construir el proyecto base llamado: ExternalService, que contendrá los servicios que se procesarán en paralelo (BusinessServices):
 

Dentro de cada Pipeline, se debe redireccionar por medio de un nodo: route, del: Servicio Virtual, al servicio expuesto por los SOAP-UI MockServices:



Dentro del proyecto: InternalService, se debe de crear dos procesos: un Pipeline y un Split-Join. El proceso: Pipeline servirá solo para redireccionar el ProxyService creado (TopDown en base al: InfoClienteService.wsdl), al proceso: Split-Join. Dentro de este se manejará el proceso en paralelo respectivamente:


Dentro del proceso: Split-Join se diseñará todo el proceso en Paralelo requerido:

Las 'Variables Locales' almacenan el resultado los mapeos respectivos por medio de los nodos: Assign, así como por medio de los nodos: Invoke Service, se puede consumir los Servicios Virtuales respectivamente.

Finalmente, por medio de un nodo: Assign se integran todos los mensajes resultantes del consumo de los dos Servicios Virtuales, para luego ser integrados en un solo mensaje por medio de: XQuery.


Es importante recordar que para los mapeos en OSB 12c, la estructura de los XQuery, varía con relación a la estructura de creación de los XQuery (Tanto del editor como de código generado) con relación a la versión 11g, esto quiere decir que no se podrán reutilizar los XQuery que ya se tengan, pero no es complicada de interpretarlo.
 

Así mismo, tener en cuenta que NO todo el mapping se podrá realizar desde el editor, ya al igual que se hacía en la version 11g, para el tema de las listas se tendrá que hacer el mapping manualmente tal como se muestra en el ejemplo con dos FOR para la obtención de los atributos de la list de respuesta:


Considerar la creación de los XQuery como arma principal para todo trabajo de transformación a nivel de OSB, prefieriendo su uso antes al de XLST por tenas de rendimiento. Así mismo, evitar el uso de XQuery incrustado dentro del los nodos: Assign, por temas de mantenimiento.  


Esperemos que con el post se hayan cubierto todas las dudas con relación al manejo de Split-Join y puedan a partir de ahora aplicarlos en sus proyectos. Para los interesados se pueden descargar las fuentes del post desde aquí: http://www.mediafire.com/download/44dzwabl2ibo452/OracleServiceBusApp_SplitJoin.zip
 

No hay comentarios: