Kafka + Docker + Net Core 101 - parte 1

Andres Lozada Mosto - Jun 10 '20 - - Dev Community

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:

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Debemos ver algo similar a esto

doker-machine ls

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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Por último, corremos docker-compose en la carpeta donde hayamos puesto el archivo yaml

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Verificamos que se encuentren Kafka y Zookeeper levantados

docker container ps
Enter fullscreen mode Exit fullscreen mode

Levantando el ambiente en Linux o con Docker for Windows

Simplemente corremos Docker Compose

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Si estas usando WSL puedes obtener el IP de la siguiente forma

wsl ip -a
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Este comando va a listar únicamente los nombres de los Topics que tenemos creados

Alt Text

Ver la descripción de un topic

docker container exec <kafka-container-id> kafka-topics \
--describe \
--topic foo \
--zookeeper zookeeper:2181
Enter fullscreen mode Exit fullscreen mode

Nos muestra información relevante del Topic

Alt Text

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
Enter fullscreen mode Exit fullscreen mode

Ahora ejecutamos el Publisher

kafka-console-producer \
--request-required-acks 1 \
--broker-list <docker-machine-ip>:9092 \
--topic foo
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ejecutando ambos programas en la consola una al lado de la otra, podremos ver que cuando publicamos un mensaje, éste aparece en la otra.

Alt Text

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:

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

Alt Text


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 💻

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player