Trabajo con Kafka en Go (Golang) con la biblioteca segmentio/kafka-go
\n\nApache Kafka es una plataforma distribuida para transmisión de datos en tiempo real que se ha convertido en el estándar de facto para construir sistemas de mensajería de alta carga. Al desarrollar en Go (Golang), una de las bibliotecas más populares y confiables para interactuar con Kafka es segmentio/kafka-go. En este artículo, analizaremos en detalle cómo instalar, configurar y usar esta biblioteca para crear productores y consumidores.
\n\n¿Por qué segmentio/kafka-go?
\n\nEn el mercado existen varias bibliotecas de Go para Kafka (por ejemplo, Sarama y Confluent Go Client). segmentio/kafka-go se destaca por las siguientes ventajas:
- \n
- Go puro — no requiere dependencias de C (a diferencia de Confluent), lo que simplifica la compilación y el despliegue. \n
- Soporte para Kafka Protocol v2 — compresión eficiente, procesamiento por lotes y trabajo con transacciones. \n
- API simple — interfaces intuitivas para productores, consumidores y administración de tópicos. \n
- Comunidad activa — actualizaciones regulares y buena documentación. \n
Instalación de la biblioteca
\n\nPara comenzar, agregue la biblioteca a su proyecto mediante go get:
go get github.com/segmentio/kafka-go\n\nAsegúrese de tener una instancia de Kafka en ejecución (localmente o mediante Docker). Ejemplo de configuración mínima con Docker Compose:
\n\nversion: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n kafka:\n image: confluentinc/cp-kafka:latest\n depends_on:\n - zookeeper\n ports:\n - "9092:9092"\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181\n KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092\n\nCreación de un productor (Producer)
\n\nEl productor envía mensajes a un tópico de Kafka. Veamos un ejemplo básico:
\n\npackage main\n\nimport (\n "context"\n "fmt"\n "log"\n "time"\n\n "github.com/segmentio/kafka-go"\n)\n\nfunc main() {\n // Configuración del productor\n writer := &kafka.Writer{\n Addr: kafka.TCP("localhost:9092"),\n Topic: "test-topic",\n Balancer: &kafka.LeastBytes{}, // Balanceo por tamaño de mensaje\n BatchSize: 10, // Enviar lote de 10 mensajes\n BatchTimeout: 100 * time.Millisecond,\n }\n defer writer.Close()\n\n // Envío de mensaje\n err := writer.WriteMessages(context.Background(),\n kafka.Message{\n Key: []byte("key-1"),\n Value: []byte("¡Hola, Kafka desde Go!"),\n },\n )\n if err != nil {\n log.Fatal("Error al enviar mensaje:", err)\n }\n\n fmt.Println("Mensaje enviado exitosamente")\n}\n\nParámetros clave de kafka.Writer:
- \n
Addr— dirección del broker de Kafka. \n Topic— nombre del tópico. \n Balancer— estrategia de distribución de mensajes entre particiones (LeastBytes, RoundRobin, Hash). \n BatchSizeyBatchTimeout— optimización del rendimiento. \n
Creación de un consumidor (Consumer)
\n\nEl consumidor lee mensajes de un tópico. Ejemplo simple con gestión manual de offset:
\n\npackage main\n\nimport (\n "context"\n "fmt"\n "log"\n\n "github.com/segmentio/kafka-go"\n)\n\nfunc main() {\n // Configuración del lector (consumidor)\n reader := kafka.NewReader(kafka.ReaderConfig{\n Brokers: []string{"localhost:9092"},\n Topic: "test-topic",\n GroupID: "my-consumer-group",\n MinBytes: 10, // Tamaño mínimo del lote\n MaxBytes: 10e6, // 10 MB\n StartOffset: kafka.FirstOffset, // Em