Updates
- 20/07/2020: Actualizado para May 2020 Windows Update y Docker Desktop sobre WSL2.
Si llegaste hasta este lugar es que ya sabes de lo que estamos hablando y quieres meter manos en el código de forma inmediata entonces esta serie de artículos es para vos 😀
Si aún no tienes bien en claro qué es Kafka y para que se lo puede usar puedes pasarte por estos lados:
Apache Kafka in Depth. In the era of Big Data, lots and lots… | by Sonu Sharma | Medium
Sonu Sharma ・ ・ 9 min read
Medium
Bueno, ahora ya sabemos para que podemos usar Kafka tratemos de correrlo localmente en nuestra PC, probar comandos básicos y crear una aplicación básica que publique eventos y otra que los consuma utilizando Net Core.
Kafka + Docker
Para levantar nuestro ambiente creamos un archivo de Docker Compose donde instanciaremos un servicio de Zookeeper y un servicio de Kafka (luego se pueden levantar mas y armar los clusters).
Las imágenes base que vamos a utilizar son las de los amigos de Confluence. No son las únicas, también podemos usar las de Bitmani|Zookeeper, Bitmani|Kafka, Spotify o Wurstmeister.
Nuestro docker-compose file nos queda de esta forma:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://127.0.0.1:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Imporatante: Para acceder a Kafka desde fuera del container se debe reeamplazar
localhost
en ADVERTISED por el IP del Docker-Machine.
Levantando el ambiente con Docker Tools (windows)
Abrimos la consola de docker y creamos una nueva Docker Machine ejecutando el siguiente comando
docker-machine create --driver virtualbox confluent
Indicamos que vamos a utilizar el driver de VirtualBox para crear la máquina virtual del host y la llamaremos confluent (podemos usar cualquier nombre)
Si usamos Linux o Windows Profesional en adelante, podemos saltarnos esta opción e ir directamente al docker-compose up
, pero para quienes usamos Windows 10 Home o versiones mas antiguas con Docker Toolbox es un paso que necesitamos hacer para tener una experiencia similar.
Revisamos que se haya creado
docker-machine ls
Debemos ver algo similar a esto
Lo siguiente a realizar es entrar a la docker machine que acabamos de crear para que los comandos se ejecuten sobre ella (sino se haría sobre la default)
eval $(docker-machine env confluent)
Obtenemos el IP para luego poder conectarnos desde C# y para usarla en la variable de entorno KAFKA_ADVERTISED_LISTENERS del archivo de docker compose
docker-machine ip confluent
Por último, corremos docker-compose
en la carpeta donde hayamos puesto el archivo yaml
docker-compose up -d
Verificamos que se encuentren Kafka y Zookeeper levantados
docker container ps
Levantando el ambiente en Linux o con Docker for Windows
Simplemente corremos Docker Compose
docker-compose up -d
Si estas usando WSL puedes obtener el IP de la siguiente forma
wsl ip -a
Con esta mínima configuración tenemos Kafka listo para las primeras pruebas, let's go! 💪😀
Divirtámonos con Kafka
Por default, Kafka viene con scrips para crear topics, publicar/leer mensajes, etc. Durante esta parte, vamos a ver como trabajar con ellos
Crear un topic nuevo
docker container exec <kafka-container-id> kafka-topics \
--create \
--topic foo \
--partitions 1 \
--replication-factor 1 \
--if-not-exists \
--zookeeper zookeeper:2181
Creamos un nuevo Topic en Kafka con una factor de replicación de 1 y con una sola partición. Si quisiéramos aumentar estos valores debemos levantar otras instancias de Kafka.
El parámetro --if-not-exists indica que el topic se creará si no existe previamente.
Listar los topics
docker container exec <kafka-container-id> kafka-topics \
--list \
--zookeeper zookeeper:2181
Este comando va a listar únicamente los nombres de los Topics que tenemos creados
Ver la descripción de un topic
docker container exec <kafka-container-id> kafka-topics \
--describe \
--topic foo \
--zookeeper zookeeper:2181
Nos muestra información relevante del Topic
Publicar un mensaje al topic
En este caso es mejor ingresar a la consola del container de Kafka y ejecutar el Producer desde allí
docker container exec -it <kafka-container-id> /bin/bash
Ahora ejecutamos el Publisher
kafka-console-producer \
--request-required-acks 1 \
--broker-list <docker-machine-ip>:9092 \
--topic foo
Luego por cada línea que escribamos (separadas por un [Enter]) se enviará un mensaje (usamos [ctrl+c] para salir del comando y exit para salir del container).
Leer de un topic
docker container exec <kafka-container-id> kafka-console-consumer \
--bootstrap-server <docker-machine-ip>:9092 \
--topic foo \
--zookeeper zookeeper:2181
Estos son los básicos para comenzar y hacer las primeras pruebas. Cada uno tiene múltiples parámetros a investigar y sacar mayor provecho.
Para un major detalle pueden ir a la docu oficial.
C# conoce Kafka
Ya tenemos Kafka ejecutándose en nuestro PC, ahora veremos como publicar y leer mensajes en un Topic.
Producer
Creamos una aplicación de consola y usamos el siguiente código reemplazando el por el que tiene el Docker-Machine.
Compilamos y ejecutamos indicando el nombre del topic al cual enviaremos mensajes. La aplicación queda a la espera de que escribamos mensajes uno por línea.
dotnet build
.
.
.
dotnet run foo
Consumer
Para el Consumer, creamos una nueva aplicación de consola y usamos el siguiente código reemplazando el valor de por el IP del Docker-Machine que estamos usando.
Compilamos y corremos indicando que Topic queremos escuchar
dotnet build
.
.
.
dotnet run foo
Ejecutando ambos programas en la consola una al lado de la otra, podremos ver que cuando publicamos un mensaje, éste aparece en la otra.
Pueden bajarse el código desde acá
Kafka tools
El universo de Tools de Kafka es inmenso y en estos listados se puede encontrar de todo:
- https://github.com/monksy/awesome-kafka
- https://github.com/semantalytics/awesome-kafka
- https://github.com/dharmeshkakadia/awesome-kafka#testing
Hay varias herramientas para manejar Kafka por medio de UI y no por comandos
Hay otros dando vueltas por ahí...
Entre los que probe, Conduktor parece bastante completo aunque la version free tiene sus limitantes. Lo bueno es que tiene integración para conectarse a Confluent y Aiven para usar sus plataformas SaaS de Kafka
Cerrando
Kafka es un monstruo que nos provee un nuevo universo de posibilidades para extender nuestras arquitecturas de maneras impensadas pero no hay que tenerle miedo para comenzar.
Vimos que con muy poco (gracias a los que crearon las imágenes de docker) se puede tener todo lo necesario para tener a Kafka corriendo sobre docker en nuestra PC y lo fácil que es comunicarse desde C#.
En las futuras entradas de esta serie de artículos iremos viendo como ir avanzando un poco más.
🧉 + 🥐🥐 = Happy coder 💻