Trabajo con Kafka en Go (Golang): biblioteca segmentio/kafka-go

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con Kafka en Go (Golang) con la biblioteca segmentio/kafka-go

\n\n

Apache 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\n

En 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\n
    \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
\n\n

Instalación de la biblioteca

\n\n

Para comenzar, agregue la biblioteca a su proyecto mediante go get:

\n\n
go get github.com/segmentio/kafka-go
\n\n

Asegúrese de tener una instancia de Kafka en ejecución (localmente o mediante Docker). Ejemplo de configuración mínima con Docker Compose:

\n\n
version: '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\n

Creación de un productor (Producer)

\n\n

El productor envía mensajes a un tópico de Kafka. Veamos un ejemplo básico:

\n\n
package 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\n

Parámetros clave de kafka.Writer:

\n
    \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
  • BatchSize y BatchTimeout — optimización del rendimiento.
  • \n
\n\n

Creación de un consumidor (Consumer)

\n\n

El consumidor lee mensajes de un tópico. Ejemplo simple con gestión manual de offset:

\n\n
package 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                    

Recommendations