Blog de Amazon Web Services (AWS)
Integrando aplicaciones durante la modernización
Por Carlos Balcázar C., Senior Solution Architect, WWPS.
A las compañías que están iniciando o en pleno proceso de modernización de sus aplicaciones principales hacia nuevas arquitecturas como microservicios o nuevas tendencias como serverless, se les presentan dos retos, ¿cómo mantener funcionando las aplicaciones actuales mientras se realiza el proceso de modernización? y ¿cómo integrarlas entre ellas y con los microservicios de manera versátil mientras controlan los costos?
Para afrontar estos retos es importante entender que las aplicaciones a modernizar son monolitos (CRM, ERP, Billing, etc.) e incluso algunas de ellas son tan antiguas que no poseen interfaces de integración estándar. Teniendo en cuenta que el proceso de modernización de un monolito puede tomar varios años, las compañías a seguir trabajando con los monolitos mientras coexisten con los nuevos microservicios.
La coexistencia genera un nuevo reto: la necesidad de integración, esta crece exponencialmente en relación a la cantidad de aplicaciones, mientras 4 aplicaciones necesitarían 12 integraciones, 50 aplicaciones podrían requerir 2401 integraciones, y el reto se hace más complejo al integrar una gran cantidad de microservicios. Es apremiante algún tipo de “plataforma” que me permita a los monolitos intercambiar información entre ellos y al mismo tiempo intercambiar información con los microservicios a medida que sean desplegados.
Algunas compañías han tratado de simplificar las integraciones usando un Enterprise Service Bus (ESB), que se define como “una plataforma de integración basada en estándares que combina mensajería, servicios web, transformación de datos y enrutamiento inteligente para conectar y coordinar la interacción de un número significativo de diversas aplicaciones a través de empresas extendidas con integridad transaccional» (Chappel, D. Enterprise Service Bus. O’Reilly, 2004), pero las opciones disponibles en el mercado son muy costosas a nivel de licenciamiento y el desarrollo/configuración de las integraciones es complejo e incluso algunas usan lenguajes de programación propietarios limitando la cantidad de integraciones a implementar.
En este blog se aborda una solución diferente, consiste en llevar una arquitectura de integración de microservicios, a cumplir con los requerimientos tradicionales de integración de Monolitos, teniendo en cuenta que un monolito se puede dividir en cientos de micro-servicios esta solución debe ser simple de implementar y de bajo costo por integración (por contrato)
Solución
A continuación, se presenta un diagrama arquitectura como único punto de integración usando servicios de AWS, el cual se explicará con base en las necesidades de integración de microservicios y monolitos
Esta nueva arquitectura, a nivel de microservicios, permite:
- Cortos tiempo de entrega al mercado (TTM)
- Autonomía en el desarrollo de los microservicios
- Desacople (a nivel de fallas y tiempos de respuesta)
- Integraciones síncronas y asíncronas
- Seguridad de la información (ej. encriptación en transito y descanso)
- Alta flexibilidad
- Orquestación de mensajes.
A nivel de integración de aplicaciones empresariales (monolitos), la arquitectura debe cumplir con los diferentes patrones “patterns” que definen las funcionalidades necesarias para lograr ser el centro de flujo de información entre las aplicaciones. Tomando como referencia “Enterprise Integration Patterns (EIP)” https://www.enterpriseintegrationpatterns.com/patterns/messaging/, para el propósito de este blog, se compara las capacidades de la arquitectura contra los patrones de integración empresarial:
Categoría / Pattern category |
Patrón / Patterns | Contempla en la arquitectura | Explicación corta |
Messaging Endpoints |
Messaging Endpoint | SI | En la arquitectura se plantean endpoint síncronos y asíncronos: 1) Amazon API Gateway (Expone Rest, https y websocket), 2) JMS con Amazon SQS (Simple Queue Service) y 3) Amazon SNS permite suscripción/publicación |
Messaging Gateway | SI | Todos los mensajes son enviados a Amazon EventBridge independiente del endPoint usado. Cuando el EndPoint usado es Amazon API Gateway, es posible configurar algunas acciones por defecto, como publicar la estructura del API. |
|
Messaging Mapper | SI | Amazon EventBridge puede seleccionar los mensajes que cumplan con ciertos criterios para luego iniciar un AWS step function y este puede mover datos entre dominios si el contenido del mensaje esta en formato JSON, en caso de ser otro formato, AWS StepFunctions deberá orquestar un Lambda para que haga este movimiento | |
Transactional Client | NO | ||
Polling Consumer | SI | Cuando una aplicación requiere consumir los mensajes vía REST y HTTPS se debe conectar al API Gateway e indicar que método necesita y recibirá el mensaje a demanda extraído de una de las colas de salida (Amazon SQS) por medio de una función de AWS Lambda. | |
Event-driven Consumer | SI | Cuando la aplicación esta lista para recibir los mensajes, tiene 4 formas de hacerlo, vía JMS conectado a la cola de salida Amazon SQS, vía SDK de la cola de salida de Amazon SQS, vía Lambda se consume un Web Service publicado por la aplicación o se suscribe a un tema en Amazon SNS para recibir el mensaje cada vez que es publicado |
|
Competing Consumers | SI | Cuando la aplicación destino no puede procesar los mensajes tan rápido como los genera el origen, es posible crear múltiples colas FIFO de salida (Amazon SQS) para que el destino pueda procesar los mensajes en paralelo. Si el destino no tiene la capacidad de procesar los mensajes en paralelo, es posible forzar la entrega del siguiente mensaje solo si el anterior fue completamente procesado usando AWS Stepfunctions |
|
Message Dispatcher | SI | Cuando el mensaje tiene que ser procesado por varios destinos, en cierto orden o coordinación, Amazon EventBridge es capaz de iniciar un AWS Step Function, y este se encargará de orquestar el orden y condiciones de ejecución de las entregas de los mensajes por medio de múltiples colas de salida (Amazon SQS) | |
Selective Consumer | PARCIAL | La aplicación que consume, no puede seleccionar los mensajes, pero si la cola de salida (Amazon SQS) de la cual obtiene los mensajes. A partir del manejo de múltiples colas de salida, es posible segmentar los mensajes que el consumidor recibe |
|
Durable Subscriber |
SI | Cuando el suscriptor de mensajes no esta escuchando, él podrá cuando retorna extraer el mensaje de la cola de salida (Amazon SQS) en cualquier momento (hasta 14 días). Tener en cuenta que existe una cola para mensajes no entregados “Amazon SQS dead letter queue» que permite reprocesar la información mas adelante. |
|
Idempotent Receiver |
SI | Si el mensaje se genera varias veces, pero se debe entregar solo una vez, es posible crear reglas de deduplicación de mensajes en AWS lambda, coordinadas por AWS Step Function y basadas en los históricos almacenados |
|
Service Activator |
NO |
||
Message Construction |
Message | SI |
El canal lo componen dos servicios: Amazon EventBridge (event bus) y Amazon SQS (administración de colas). El mensaje es enviado por el generador a alguno de los endpoint de entrada, luego ingresa a Amazon Event Bridge que de acuerdo a las reglas de enrutamiento lo envía a una cola de salida (Amazon SQS) de donde es entregado al receptor vía alguno de los endpoint de la arquitectura o enviado (vía AWS Lambda) al destinatario |
Command Message |
SI | En la arquitectura los mensajes de tipo comando se manejarán como un cualquier mensaje, dependerá del receptor interpretarlo como comando. |
|
Document Message |
SI | Nativamente Amazon Event Bridge solo puede transportar mensajes hasta 256 KB incluido estructura, en el caso de mensajes de mayor tamaño, serán almacenados de manera temporal en Amazon S3, y se trasportará vía Amazon EventBridge y Amazon SQS solamente los identificadores y el encabezado de los mensajes. |
|
Event Message |
SI | Cuando el mensaje tiene que ser procesado por uno o varios destinos, Amazon EventBridge es capaz de iniciar un AWS Step Function, y este se encargará de entregar el mensaje a varias colas (Amazon SQS) las cuales pueden ser “standard» o «FIFO» |
|
Request-Reply |
PARCIAL | Cuando la aplicación que genera el mensaje requiere una respuesta de la aplicación receptora (integración síncrona), vía HTTPS o REST, es posible que API Gateway entregue una respuesta genérica e indicando donde la aplicación generadora puede buscar la respuesta. También es posible que vía AWS Lambda se consuma un WebService y se envía la respuesta directamente |
|
Return Address |
PARCIAL | Cuando hay varios generadores de mensajes con un mismo destino, el mensaje de respuesta se enrutará gracias al almacenamiento histórico en Amazon DynamoDB en donde se podrá identificar el origen del mensaje y enrutar la respuesta a la cola (Amazon SQS) correspondiente |
|
Correlation Identifier | SI | Para lograr la correlación entre mensajes y respuestas, se usarán dos identificadores, el primero es originID que debe ser parte del mensaje enviado por aplicación generador y el otro es “RequestID», es identificador único asignado al mensaje cuando este es recibido por el endPoint. Estos dos IDs acompañaran al mensaje mientras viajen en la arquitectura |
|
Message Sequence | PARCIAL | Cuando la aplicación receptora no es capaz de procesar mensajes de gran tamaño, Amazon EventBridge puede iniciar un AWS Step Function que coordine funciones AWS Lambdas para dividir el mensaje en unos mas pequeños y entregarlos a la cola correspondiente (Amazon SQS). Estos mensajes deberán conservar el «RequestID» y el originID del mensaje original, igualmente se deberá indicar que el mensaje fue dividido y un identificador de la secuencia de la cual esta compuesto. |
|
Message Expiration |
PARCIAL | Aunque el generador del mensaje no puede establecer el vencimiento (expiration) de cada mensaje, es posible configurar el vencimiento en la configuración de la cola de salida (Amazon SQS) de tal manera que, si el mensaje no es tomado/eliminado de la cola, se mueve a la cola «dead-letter queue» |
|
Format Indicator |
PARCIAL | Cuando el generador del mensaje requiere indicar cual es el formato con el cual debe ser tratado el mensaje. Amazon EventBridge recibe todos los mensajes, existe unas reglas que permiten filtrar e iniciar un Amazon Step Function, este podría usar diferentes formatos para procesar el mensaje de pendiendo de un valor proveniente en el mensaje original |
|
Messaging Channels |
Message Channel | SI | El canal lo componen dos servicios Amazon EventBridge (event bus) y Amazon SQS (cola de salida). El mensaje es enviado por el generador a alguno de los endpoint de entrada, luego ingresa a Amazon Event Bridge que de acuerdo a las reglas de enrutamiento lo envía a una cola de salida (Amazon SQS) de donde es entregado al receptor vía alguno de los endpoint de la arquitectura o enviado (vía AWS Lambda) al destinatario directamente |
Point to Point channel |
SI | Es posible garantizar que solo un destinatario reciba el mensaje cuando Amazon EventBridge enruta el mensaje solo a una cola de tipo FIFO en Amazon SQS. |
|
Publish-Subscribe Channel | PARCIAL | Los receptores de los eventos pueden suscribirse a un tema «topic» en el servicio Amazon SNS de manera que reciban el mensaje cuando se realice una publicación. En la arquitectura es posible realizar esto cuando la cola de salida (Amazon SQS) publica el mensaje en el tema “topic» de Amazon SNS. |
|
Datatype Channel | SI | Cuando el receptor recibe múltiples mensajes del mismo generador (origen) pero los mensajes (tipo / estructura) son diferentes, puede diferenciarlos gracias a la cola de salida (Amazon SQS) en la cual Amazon EventBridge lo envió. |
|
Invalid messages channel | SI | Cuando AWS Lambda envía un mensaje a un receptor, este puede decidir si el mensaje es valido o no, en la función sería necesario configurar un procedimiento para mover el mensaje a una cola de mensajes inválidos (Amazon SQS) |
|
Dead letter channel | SI | Cuando un mensaje no puede ser enviado o no es reclamado por el receptor desde la Cola (Amazon SQS), es movido a una cola llamada Dead letter queue. |
|
Guaranteed Delivery | PARCIAL | En la arquitectura es posible persistir en la entrega del mensaje solo cuando el mensaje ya se encuentra en Step Function. La arquitectura basa la garantía de entrega en el compromiso de disponibilidad de SQS que es del 99,9%. |
|
Channel adapter | SI | En la arquitectura se plantean endpoint síncronos y asíncronos: 1) Amazon API Gateway (Expone Rest, https y websocket), 2) JMS con Amazon SQS (Simple Queue Service) y 3) Amazon SNS permite suscripción/publicación. Si el mensaje debe ser entregado vía un API o WebService es posible enviarlo usando una función «AWS Lambda» |
|
Messaging Bridge | NO | ||
Message Bus | SI | En la arquitectura el servicio Amazon EventBridge se comporta como un bus, gracias a su componente “EventBus». Es importante aclarar que se hace una analogía entre eventos y mensajes. |
|
Message Routing |
Pipes and Filters | SI | Es posible ejecutar tareas complejas sobre el mensaje, cuando Amazon EventBridge inicia un AWS step function, es posible orquestar la ejecución de funciones AWS Lambda que realicen actividades complejas como desencripción, deduplicación, transformación, filtrados, etc. |
Message Router | SI | Usando las reglas de enrutamiento de Amazon Event Bridge es posible enviar mensajes a diferentes colas de salida o incluso a AWS StepFunction para su procesamiento. |
|
Content-Based Router | SI | Las reglas de enrutamiento de Amazon EventBridge puede filtrar los mensajes basados en la información de los mismos. Si la información que permite decidir el destino esta en un formato diferente a JSON, será necesario realizar la conversión a JSON. |
|
Message Filter | SI | La arquitectura presenta dos niveles de filtrado para los mensajes entrantes: 1. Amazon API Gateway filtrará los mensajes mal formados o con problemas de protocolo. 2. Amazon Event Bridge filtrará los mensajes que no cumplan con ninguna regla. |
|
Dynamic Router | NO | ||
Recipient List | PARCIAL | Una vez entregado el mensaje por Amazon EventBridge a AWS Step Function, se construye una lista de receptores a quienes se les envía el mensaje. Si el numero de destinatarios es menor a 5, es posible que Amazon EventBridge envíe directamente el mensaje usando 5 colas (Amazon SQS) |
|
Splitter | SI | Una vez Amazon EventBridge entrega el mensaje a AWS Step Function, se puede orquestar la división del mensaje original en unos mensajes que solo contengan un fragmento de la información original, para que finalmente cada uno sea a una cola diferente. (Amazon SQS) | |
Aggregator | PARCIAL | Usando AWS Step Functions es posible orquestar funciones AWS Lambda para unir la información del mensaje con información proveniente de otra fuente. Cuando se desea unir la información de dos mensajes, se usará Amazon DynamoDB/ Amazon S3 para almacenar de manera temporal los eventos y así poder hacer operaciones entre varios mensajes |
|
Resequencer | NO | ||
Composed Message Processor | SI | Basado en el patrón “splitter» (dividir y enrutar) y el patrón «Aggregator” (unir varios mensajes), es posible procesar varios mensajes de manera compleja y paralela usando AWS Lambdas orquestados por AWS Step Functions, y finalmente unirlos para entregar un solo mensaje al destino. |
|
Scatter-Gather | SI | Usando Amazon EventBridge, Amazon SQS y Amazon SNS es posible entregar un mensaje a múltiples destinos en paralelo, y en el caso de este patrón es opcional de cada destino dar respuesta. Usando AWS Step Functions es posible esperar la respuesta de los destinos y agruparla en un solo mensaje de respuesta para el generador inicial. | |
Routing Slip | PARCIAL | Usando las reglas de Amazon Event Bridge es posible enviar el mensaje a diferentes AWS StepFunctions quienes orquestarán AWS Lambdas de manera que el procesamiento del mensaje se asimile a los pasos en un flujo de trabajo. El flujo se basa en condiciones de acuerdo a los datos del mensaje. |
|
Process Manager | SI | En la arquitectura quien ejecuta el patrón de «Process Manager» es la combinación entre las reglas de Amazon EventBridge y las máquinas de estado de AWS Step Functions. | |
Message Broker | SI | Usando las reglas de Amazon Event Bridge y las colas de Amazon SQS es posible manejar, enrutar y desacoplar la comunicación entre origen y destino (mensajes) |
|
System Management |
Control Bus | SI | AWS tiene una consola de administración unificada donde es posible configurar todos los servicios presentados en la arquitectura. Para controlar y visualizar el estado de los mensajes, su procesamiento y las colas, es posible usar la consola de AWS Step Function y los servicios Amazon CloudWatch y AWS CloudTrail |
Detour | SI | Usando las reglas de Amazon EventBridge es posible desviar los mensajes a una ruta alterna donde se realiza el seguimiento o algún tipo de control, finalmente se puede enviar a la cola de salida o alguna cola de prueba (Amazon SQS) |
|
Wire Tap | SI | Para los mensajes que solo pueden tener un destino y se debe entregar una sola vez, se pueden usar Amazon Event Bridge y 2 colas FIFO (Amazon SQS) para garantizar una sola entrega al destino y al mismo tiempo atrapar una copia de los mensajes para tareas de depuración o análisis | |
Message History | SI | Todos los mensajes deberán ser almacenados en Amazon DynamoDB de manera temporal, se habilitarán las funcionalidades de backup y se ejecutará limpieza periódica. En caso de mensajes de gran tamaño, el contenido será almacenado en Amazon S3 y solo los identificadores y el encabezado serán almacenados en Amazon DynamoDB |
|
Message Store |
SI | Todos los mensajes deberán ser almacenados en Amazon DynamoDB de manera temporal, se habilitarán las funcionalidades de backup y se ejecutará limpieza periódica. En caso de mensajes de gran tamaño, el contenido será almacenado en Amazon S3 y solo los identificadores y el encabezado serán almacenados en Amazon DynamoDB |
|
Smart Proxy |
PARCIAL | Una vez el mensaje llega a la arquitectura, se obtiene la información del generador del mensaje y luego usando AWS Step Función y AWS lambda se entrega la respuesta al mismo origen. De igual manera, es posible que el mensaje de respuesta contenga la dirección a quien se desea entregar el mensaje o cola de salida en la cual se debe dejar el mensaje. |
|
Test message | SI | Es posible inyectar mensajes de pruebas directamente en el endpoint de entrada (Amazon SQS o Amazon API Gateway), se debe definir una marca (campo) en los mensajes para que estos sean enviados a las colas de salida (después de procesamiento) especialmente destinadas a monitoreo en lugar de las colas de salida de producción (Amazon SQS) | |
Channel Purger | PARCIAL | En la arquitectura se presenta un canal como la combinación entre Amazon Event Bridge (Event Bus) y Amazon SQS (Queue). Vía AWS console o AWS CLI es posible purgar las colas de Amazon SQS, en caso de ser necesario garantizar que las colas estén vacías. |
|
Message Transformation |
Message Translator | SI | Amazon EventBridge puede filtrar los mensajes que requieran algún tipo de transformación e iniciar un AWS StepFunction para que orqueste funciones AWS Lambda para transformar el mensaje en el formato de destino, luego es colocado en la cola de salida (Amazon SQS). Las funciones AWS Lambda puede ser desarrolladas por defecto en 7 lenguajes de programación. |
Envelope Wrapper | SI | Idealmente todos los mensajes deben tener 2 secciones, un encabezado y el contenido. Siendo el encabezado toda la información necesaria para identificar y clasificar los mensajes y el contenido es la carga útil del mensaje. Usando AWS KMS, se administra las llaves con las cuales se puede encriptar/desencriptar el contenido del mensaje cuando sea necesario |
|
Content Enricher |
SI | En las reglas de Amazon EventBridge se pueden filtrar los mensajes que requieran algún tipo de enriquecimiento, estos mensajes inician un AWS Step Function, el cual orquestará una función AWS Lambda para enriquecer los mensajes basados en cualquier base de datos, como por ejemplo Amazon DynamoDB, |
|
Content Filter |
SI | Usando AWS Step Functions es posible filtrar/seleccionar parcialmente el contenido del mensaje cuando está en formato JSON, en caso que el contenido del mensaje tenga otro formato, AWS Step Functions orquestará funciones AWS Lambda para filtrar/seleccionar solamente la información del mensaje original que se requiere entregar a la cola de salida (Amazon SQS) |
|
Claim Check | PARCIAL | Nativamente Amazon Event Bridge solo puede transportar mensajes hasta 256 KB incluido estructura, en el caso de mensajes de mayor tamaño, serán almacenados de manera temporal en Amazon S3, y se trasportará vía Amazon EventBridge y Amazon SQS solamente los identificadores y el encabezado de los mensajes. |
|
Normalizer | SI | Amazon EventBridge puede filtrar los mensajes que requieren algún tipo de normalización e inicia un AWS Step Function para que orqueste funciones AWS Lambda y finalmente el mensaje normalizado es colocado en la cola de salida. Las funciones AWS Lambda puede ser desarrolladas por defecto en 7 lenguajes de programación. |
|
Canonical Data Model | SI | En la arquitectura se plantea que los mensajes sean convertidos a formato JSON, con dos secciones, encabezado y contenido. Este formato se usará como canónico cuando la información viaje entre los servicios de AWS. |
Conclusión
La arquitectura presentada puede ser el único punto de integración entre las aplicaciones monolíticas, los microservicios y entre aplicaciones y microservicios. Es 100% serverless (sin administración de servidores), lo que permite manejar los costos orientados a la transacción, en este caso el mensaje, el cual puede ser alrededor de USD 0,0006 por mensaje, sin costos adicionales por licenciamiento. Permitiendo a las compañías orientar sus costos a la unidad de venta con base en su modelo de negocio.
A nivel de los patrones de integración, de los 61 patrones, la arquitectura se alinea con 42 completamente, 14 patrones parcialmente y solo quedando por fuera 5 patrones, lo cual resulta muy útil durante la modernización de aplicaciones e incluso en el futuro cuando todas las aplicaciones sean microservicios.
Para mayor información de los servicios incluidos en la arquitectura, a continuación, se presentan algunos links de interés:
Amazon SQS: https://aws.amazon.com/sqs/
Amazon API Gateway: https://aws.amazon.com/api-gateway/
AWS Lambda: https://aws.amazon.com/lambda/
Amazon DynamoDB: https://aws.amazon.com/dynamodb/
Amazon EventBridge: https://aws.amazon.com/eventbridge/
Amazon S3: https://aws.amazon.com/s3/
AWS Step Functions: https://aws.amazon.com/step-functions/
Amazon SNS: https://aws.amazon.com/sns/
AWS Key Management Service (KMS): https://aws.amazon.com/kms/
Amazon CloudWatch: https://aws.amazon.com/cloudwatch/
AWS CloudTrail: https://aws.amazon.com/cloudtrail/
Sobre el autor
Carlos Balcazar es Arquitecto de Soluciones, ha apoyado a múltiples organizaciones de gobierno en su viaje a la nube. Igualmente ha liderado empresas de tecnología en modelos ISV.
Revisores
Ricardo Castañeda es consultor de Servicios Profesionales en AWS. Ingeniero de software, entusiasta del cómputo de la nube y practicante de jiujitsu.
Germán Ruiz es Arquitecto de Soluciones de Partners en Amazon Web Services para el Sector Público en Centro América y el Caribe, apoyándolos en su camino a la innovación y adopción tecnológica.