En este post descubrimos cómo AsyncAPI revoluciona la comunicación entre sistemas al permitir operaciones no secuenciales, mejorando el rendimiento y la escalabilidad de las aplicaciones web. Exploraremos sus características y ejemplos prácticos para comprender su impacto en el desarrollo de aplicaciones.
Qué es AsyncAPI
AsyncAPI es una especificación que permite definir APIs y que se enfoca en Arquitecturas Orientadas en Eventos (EDA, Event Driven Architecture). Una EDA es un paradigma de diseño en el que un consumidor de eventos recibe una notificación de que un evento ha sido publicado en un canal por un publicador también conocido como generador de eventos.
Es un modelo menos acoplado que el modelo clásico (petición-respuesta) como el de las API RESTful pues el publicador no conoce ni al menos la identidad del consumidor de los eventos. En una EDA los componentes con pobre rendimiento no bloquean a sus consumidores, sino que generan más eventos que son encolados, lo que facilita mejorar el rendimiento de la solución sin necesidad de rediseñar.
Características de AsyncAPI
Se caracteriza por tener enfoque de protocolo agnóstico, de naturaleza open-source y la elevada productividad dada la similitud con OpenAPI y la variedad de herramientas que ofrece. La principal diferencia con respecto a una API síncrona es la infraestructura, poniendo como pieza intermedia un “broker”, por lo que la comunicación no siempre es directa entre consumidor-publicador.
El funcionamiento de AsyncAPI se basa en dos suposiciones:
- Que los mensajes impulsan la mayoría de las interacciones API en su núcleo
- Que estos mensajes son acciones o eventos. En este sentido, persigue representar todo como un sistema de mensajes, con un encabezado y una carga útil como opcionales y no obligatorios. AsyncAPI pretende habilitar la definición de API utilizando definiciones basadas en canales independientes del protocolo. Sin duda, un punto interesante de AsyncAPI es la variedad de protocolos que maneja. Existen enlaces AsyncAPI para varios protocolos, incluidos WebSockets, Apache Kafka, MQTT, AMQP, IBM MQ, SNS, y JMS.
Al definir una relación contractual muy específica entre los elementos de la API, los desarrolladores pueden controlar y gestionar con mayor precisión el flujo de estos mensajes y su salida resultante. Dado que estos mensajes generalmente pasan a través de un “broker”, tener un contrato comúnmente definido y aceptado permite un sistema de control granular mucho más alto, lo que resulta en un sistema efectivo, comprensible, y eficiente.
Objetivos de AsyncAPI
AsyncAPI persigue entre sus objetivos lograr que trabajar con EDA sea tan sencillo como con las APIs RESTful, así como mejorar el funcionamiento de la especificación para que sea cada vez más fluida, de tal forma que los usuarios puedan crear APIs rápido y sin conocimientos previos de AsyncAPI.
Aportes
Su principal aporte es la estandarización de la comunicación entre APIs haciendo los eventos más legibles para las máquinas y facilitando el trabajo de los desarrolladores.
Enfoques para documentar
Impulsores de AsyncAPI mencionan tres enfoques sobre cómo trabajar con el proyecto:
- “Design First”: Documentar con AsyncAPI y generar el código.
- “Code First”: Primero escribir el código y luego documentar.
- Y el enfoque mejor recomendado: usar el fichero de AsyncAPI como fichero de configuración, de forma que se implemente solamente lo que está documentado. Para este caso, se puede emplear el framework Glee desarrollado por el proyecto de AsyncAPI.
Herramientas y lenguajes
Puedes encontrar una amplia variedad de herramientas en la página de AsyncAPI, entre las cuales se destacan herramientas de comparación, extensiones para entornos de desarrollo, validadores, generadores de códigos, entre otras, y el empleo de varios lenguajes, entre ellos Java, Javascript, C# y Python.
Cada una de estas herramientas aporta al proyecto que trabajemos más calidad y coherencia, pues tienen implícito las buenas prácticas para documentar, versionar, nombrar los elementos siguiendo una nomenclatura sencilla y sugerente y generar código en correspondencia con lo que documentamos. Y principalmente, siguiendo alguno de los enfoques antes mencionado se obtiene un proyecto con alto valor agregado.
Ejemplo
Para comprender mejor AsyncAPI podemos analizar un ejemplo de código basado en el siguiente escenario:
- Necesitamos definir una API en un escenario asíncrono y a cada compra realizada por un cliente, se notifica a un consumidor a través de un evento, y en consecuencia este puede tomar una decisión o realizar una determinada acción. El código para este ejemplo se define a continuación con sus elementos:
Imagen 1. Ejemplo generado en https://studio.asyncapi.com/
Veamos a continuación algunos elementos de la estructura:
- A continuación del tipo, encontramos info que es un objeto, que contiene el nombre (title) y version.
- servers: dónde y cómo conectarse a un servidor de mensajes, especificando url y protocol (amqp, mqtto, wspor, u otro).
- channels: para enviar (message) a la aplicación.
- payload: cómo se hacen los message.
En el siguiente repositorio puedes encontrar varios ejemplos: