Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquitecturas dirigidas por eventos con Kafka y Clojure

Arquitecturas dirigidas por eventos con Kafka y Clojure

Las arquitecturas dirigidas por eventos son populares a la hora de diseñar sistemas distribuidos asíncronos y altamente escalables. Estas arquitecturas son muy adaptables y pueden ser usadas tanto por aplicaciones pequeñas y grandes.

En esta charla, usaremos Clojure y Apache Kafka para construir un sistema dirigido por eventos. Apache Kafka es una plataforma distribuida de transmisión que nos permite construir aplicaciones de procesamiento de datos y streaming. Esta plataforma se caracteriza por ser escalable horizontalmente, a prueba de fallos, rápido, y es utilizado en producción por compañías como Netflix y Trivago. Clojure, por otro lado, es un lenguaje de programación dinámico que corre sobre la JVM y nos deja acceder el ecosistema de librerías de Java.

Presentador: William Arellano

RECURSOS

- Sitio oficial de Apache Kafka
https://kafka.apache.org/intro
- Design Event-Driven Systems: Concepts and Patterns for Streaming Services with Apache Kafka
https://www.confluent.io/designing-event-driven-systems/
- Microservices with Clojure: Develop event-driven, scalable, and reactive microservices with real-time monitoring
https://www.amazon.com/Microservices-Clojure-event-driven-microservices-monitoring/dp/1788622243
- Jackdaw Streams API
https://engineering.fundingcircle.com/blog/2019/08/27/kafka-streams-the-clojure-way/
- Jackdaw API Docs
https://cljdoc.org/d/fundingcircle/jackdaw/0.7.4/doc/readme

Quito Lambda

June 24, 2020
Tweet

More Decks by Quito Lambda

Other Decks in Programming

Transcript

  1. Agenda • Arquitectura dirigida por eventos ◦ Razon de ser

    ◦ ¿Que es una arquitectura dirigida por eventos? ◦ ¿Que es un evento? ◦ ¿Cuando usar una arquitectura dirigidas por eventos? • Event-sourcing • Command Query Responsibility Segregation • Apache Kafka • Clojure + Jackdaw
  2. ¿Que es una arquitectura dirigida por eventos? Una arquitectura dirigida

    por eventos está compuesta por componentes desacoplados que procesan eventos de manera asíncrona.
  3. ¿Que es un evento? Un evento es un mensaje que

    comunica a otros que un hecho de importancia ha sucedido, con la particularidad que los mismos no tienen expectativa de una acción futura y no esperan respuesta. Ejemplos: • Se ha creado un usuario • Se ha eliminado un usuario • Se ha autenticado un usuario
  4. ¿Cuando usar una arquitectura dirigida por eventos? Cuando queremos: •

    Servicios desacoplados • Comunicación de forma asincrónica • Registro auditable
  5. ¿Que es event-sourcing? Algunas arquitecturas dirigidas por eventos tienen la

    habilidad de recrear el estado de la aplicación en cualquier momento al procesar los eventos. Para esto queremos eventos: • Immutables • Ordenados • Describan los cambios en las entidades de negocio
  6. Ventajas del Event Sourcing • Se puede recrear el estado

    de la aplicación después de un fallo. • Los eventos son herramientas útiles para hacer debugging o auditar el comportamiento de la aplicación. • Permite que servicios que se construyan a posteriori puedan utilizar los eventos.
  7. Desventajas del Event Sourcing • Complejidad en el diseño ◦

    Es fácil crear eventos es difícil procesarlos ◦ Es difícil descubrir eventos ◦ Manejo de errores • Seguridad del broker
  8. ¿Qué es CQRS? El patrón de diseño “Command Query Responsibility

    Segregation” separa la aplicación en dos partes: query o consulta y command o comando. Escritura <=/=> Lectura
  9. ¿Qué es Apache Kafka? Apache Kafka es una plataforma distribuida

    de streaming de registros con tres características principales: • Permite a clientes publicar y suscribirse a streams de registros denominados topics • Almacenar de manera permanente y a prueba de fallos los streams de registros • Procesar los streams de registros mientras estos ocurren
  10. Apache Kafka APIs • Producer API • Consumer API •

    Connector API • Streams API • Admin API
  11. ¿Qué es Clojure? Clojure es un lenguaje de programación de

    propósito general con tipos dinámicos, en pocas palabras es un dialecto de Lisp para la JVM. Clojure: • Es un lenguaje de programación funcional • Puede acceder a las librerías de Java • Sigue la filosofía de code-as-data • Read-Eval-Print-Loop (REPL)
  12. Curso rápido de Clojure parte 1 Literales de Clojure: •

    Los usuales números, caracteres, cadenas de caracteres y puntos flotantes. • Simbólos ◦ + ◦ map ◦ clojure.core/map • Keywords ◦ :alpha ◦ :release/alpha
  13. Curso rápido de Clojure parte 2 Colecciones: • Listas: `(1

    2 3) • Vectores: [1 2 3] • Conjuntos: #{1 2 3} • Mapas: {:key-1 value-1, :key-2 value}
  14. Curso rápido de Clojure parte 3 Expresión de Clojure: Imagen

    tomada de: https://clojure.org/guides/learn/syntax
  15. Curso rápido de Clojure parte 4 Definir variables y funciones

    en Clojure: (def my-val 23) (defn square [x] (* x x))
  16. ¿Por qué Clojure? • Podemos utilizar directamente las librerías de

    Java para Kafka • Podemos usar jackdaw • Desarrollo con el REPL • No tenemos que usar Java
  17. Jackdaw AdminClient API Todas las funciones requieren el AdminClient: (def

    app-config {"bootstrap.servers" "localhost:29092"}) (def admin-client (ja/->AdminClient app-config))
  18. Jackdaw AdminClient API Podemos listar topics: (ja/list-topics admin-client) Podemos borrar

    topics (ja/delete-topics! admin-client [{:topic-name “prueba”}])
  19. Jackdaw Client API Útil definir los serdes que utilizaran los

    producers y consumers: (def consumer-serdes {:key-serde (jse/serde) :value-serde (jse/serde)}) (def producer-serdes {:key-serde (jse/serde) :value-serde (jse/serde)})
  20. Jackdaw Client API Producir un evento: (with-open [my-producer (jc/producer app-config

    producer-serdes)] @(jc/produce! my-producer {:topic-name "prueba"} {:key 1} {:event-type :test-event :value 1}))
  21. Jackdaw Client API Crear un consumer y hacer polling de

    eventos: (with-open [my-consumer (-> (jc/consumer consumer-config consumer-serdes) (jc/subscribe [{:topic-name "prueba"}]))] (doseq [{:keys [key value timestamp]} (jl/log my-consumer 200)] (println "Key: " key)...))
  22. Jackdaw Client API Crear un Consumer que monitoree un topic:

    (defonce monitor-topic? (atom true)) (defn monitor-topic [] (reset! monitor-topic? true) (future (with-open [my-consumer ...] (loop [results (jc/poll my-consumer 200)] (doseq [{:keys [key value timestamp]} results] (println ...)) (if @monitor-topic? (recur (jc/poll my-consumer 200)) nil)))))
  23. Jackdaw Streams API En otra ocasión, para este rato un

    pequeño abrebocas: Con Jackdaw Streams podemos crear aplicaciones de streaming por composición de transductores de Clojure. Ver mas
  24. Recursos Adicionales • Sitio oficial de Apache Kafka • Design

    Event-Driven Systems: Concepts and Patterns for Streaming Services with Apache Kafka • Microservices with Clojure: Develop event-driven, scalable, and reactive microservices with real-time monitoring • Jackdaw API Docs