Iniciando Kafka con docker
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.