En nuestro canal de Youtube iniciamos la serie “Guiado por eventos” en la cual tiene como objetivo explicar los diferentes enfoques de event-driven, iniciamos con un primer vídeo en el que hablamos de las diferencias entre Request/Response vs EventDriven y seguiremos combinando elementos teóricos con prácticos.

La solución que usaremos en la serie como Event Bus será Kafka & Zookeeper.

¿Qué es Kafka?

 Apache Kafka proporciona un bus de mensajes escalable, distribuido y altamente resiliente creado por LinkedIn y de código abierto basado en una arquitectura P2P (arquitectura Peer to Peer). El corazón de kafka es el commit log distribuido (hablaremos más de esto en el canal).

Destaca por:

  • Está escrito en scala (y algo de Java).
  • Plataforma para la nueva generación de aplicaciones distribuidas.
  • Destaca en otros ámbitos como la comunicación de aplicaciones.
  • Pertenece al ámbito “Distributed Messaging Queue”.
  • Alternativa a JMS, AMQP y RabbitMQ cuando se maneja volúmenes importantes de datos/información y se requiere un gran capacidad de respuesta.
  • Permite analizar y procesar datos en tiempo real.
  • Dispone de un API de “Producer”: Facilita que una aplicación publique una secuencia de mensajes en uno o más tópicos de diferentes formas.
  • Dispone de un API de “Consumer”: Facilita que una aplicación pueda suscribirse a uno o más tópicos y así poder procesar la secuencia de mensajes.
  • Dispone de un API de “Streams”: Facilita procesar un flujo consumiendo un flujo de entrada de uno o más tópicos y produciendo un flujo para uno o más tópicos de salida.
  • Dispone de un API de “Connector”: Facilita implementar/ejecutar productores o consumidores reusables con el objetivo de conectar tópiicos con aplicaciones externas, por ejemplo: MySQL, ElasticSearch, etc.

¿Cómo instalar Kafka con Docker?

La instalación de Kafka con docker la realizaremos usando docker-compose. ¿Cómo gestionas tus imágenes docker locales? Te recomiendo esta entrada en la que hablamos de Portainer, una excelente herramienta: Portainer, gestionando docker de forma sencilla.

Para la instalación luego de que tengas instalado docker-compose, crea una carpeta y dentro crea un fichero docker-compose.yml, en el fichero coloca el siguiente contenido.

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

Ahora entra desde la terminal a la carpeta:

$cd /mi-carpeta
$docker-compose up -d

Si tiras el comando docker ps deberia verse así:

docker ps |grep kafka
3b46d7f2d0ef   confluentinc/cp-kafka:latest       "/etc/confluent/dock…"   2 weeks ago   Up 9 seconds        9092/tcp, 0.0.0.0:29092->29092/tcp, :::29092->29092/tcp                                kafka_kafka_1
e3818f131189   confluentinc/cp-zookeeper:latest   "/etc/confluent/dock…"   2 weeks ago   Up About a minute   2888/tcp, 3888/tcp, 0.0.0.0:22181->2181/tcp, :::22181->2181/tcp      

He agregado un grep adicional para filtrar 🙂

Ahora comprueba que Kafka y Zookeeper son accesibles desde el localhost, para ello usaremos netcat y haremos un nc a los puertos 29092 y 22181 que son los que hemos exportado en nuestro docker-compose.

$nc -zv localhost 29092
Connection to localhost (::1) 29092 port [tcp/*] succeeded!

$ nc -zv localhost 22181
Connection to localhost (::1) 22181 port [tcp/*] succeeded!

Listo, hemos terminado, ya tienes Kafka listo para desarrollar.