Generando indicadores de negocio en tiempo real mediante ksqlDB
Por: Eduwer Camacaro, Andrés Salazar y Saúl Piña
Imagina que actualmente trabajas en una empresa de telecomunicaciones y eres parte de un equipo en el que deben tomar una decisión técnica acerca de una nueva necesidad de negocio: se deben calcular los consumos de datos de navegación, llamadas, y mensajes de texto que cada cliente ha utilizado en un periodo de tiempo. Además, es importante tomar en cuenta que cada cliente tiene un límite de consumo, por lo tanto un usuario no puede realizar una determinada operación si ya no posee cupo.
Tu objetivo será proponer al equipo una solución que se adapte a este nuevo requisito de negocio, para ello primero te enfocas en tratar de entender la arquitectura actual. El siguiente diagrama detalla los componentes relevantes:
En el transcurso de tu investigación, te enteras de que hay una aplicación que maneja la información personal de los clientes y los límites de consumo de cada uno de ellos. Además, ves que existe una aplicación que produce mensajes a un tópico de Apache Kafka denominado usage_charges cada vez que un cliente consume un nuevo tipo de servicio. Hasta el momento la decisión técnica puede ser el tener que consolidar información proveniente de dos orígenes de datos: usage_producer y customer service application.
Puedes optar por desarrollar un nuevo servicio, o lo que hoy llamaríamos microservicio, donde se puedan realizar estas operaciones de agregación, principalmente consumir los mensajes del tópico usage_charges y consultar la información almacenada en customer service application y de esta manera consolidar dicha información con el objetivo de cubrir los requisitos de negocio planteados al inicio.
Pero antes de presentar la propuesta al equipo, aterricemos estos conceptos utilizando terminología relacionada a event streaming. Un streams de eventos que se actualiza cada vez que un cliente consume un tipo de servicio. Por otro lado, se tiene una aplicación que puede actualizar los datos personales y límites de consumo de los clientes. A estos cambios también le podemos denominar como streams de eventos ya que pueden ocurrir constantemente e infinitamente a lo largo del tiempo. Dicho esto, podemos analizar una solución mediante una stream processing application, en el mundo de Apache Kafka, denominamos de esta forma a toda aplicación que utiliza la biblioteca Java kafka streams como dependencia.
Kafka Streams nos provee todo un entorno para aplicar operaciones con estado o sin estado sobre nuestros flujos de eventos. Las operaciones con estado son aquellas que nos permiten almacenar datos con el transcurrir de nuevos eventos, lo que nos permitiría conocer la suma total de por tipo de servicio que ha consumido un cliente. Cuando hablamos sobre operaciones sin estado, nos referimos a aquellas que solo realizan algún tipo de transformación o filtros sobre el evento, como por ejemplo, podríamos transformar un atributo de nuestro evento de tipo timestamp a otro formato de fecha. Para nuestro escenario, principalmente necesitamos realizar operaciones con estado, pero en algún punto necesitaremos consultar ese estado por lo que Kafka Streams nos ofrece dos opciones para ello.
La primera opción es emitir un nuevo mensaje a un tópico por cada vez que un cliente aumente la cantidad consumida de un tipo de servicio específico. Incluso podemos emitir otros tipos de eventos si es que un cliente ya alcanzó el límite de consumo para que otros servicios puedan procesarlos.
La segunda opción, es consultar el estado actual de la aplicación, lo cual nos permite exponer algún tipo de API y realizar consultas desde servicios externos, por ejemplo, podríamos conocer cuál es la cantidad actual consumida de un servicio por un cliente en cualquier momento. Kafka Streams también nos ofrece de manera predeterminada la escalabilidad, tolerancia a fallas, resiliencia entre otras capacidades, sin embargo se debe considerar que esto implicaría tener que desarrollar, mantener, desplegar y monitorear una nueva aplicación, en su lugar, podemos utilizar ksqlDB para crear event streaming applications de una forma declarativa utilizando SQL.
ksqlDB forma parte del ecosistema Apache Kafka, su funcionamiento se basa en la interpretación de sentencias SQL y crear aplicaciones Kafka Streams por lo cual mitigamos las complejidades que conlleva desarrollar una aplicación Kafka Streams sin abandonar todas las ventajas que analizamos anteriormente, además nos da la posibilidad de crear funciones personalizadas en el caso de necesitar alguna lógica específica para nuestro caso de uso.
Disclaimer: las declaraciones y opiniones expresadas en este artículo son las de l@s autor@s y no reflejan necesariamente las posturas de Thoughtworks.
¿Quieres formar parte de Thoughtworks Ecuador? Aplica a nuestras vacantes en nuestra página web https://thght.works/3F3T4JA