Trabalhando com Kafka em Go (Golang): biblioteca segmentio/kafka-go

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com Kafka em Go (Golang) com a biblioteca segmentio/kafka-go

\n\n

Apache Kafka é uma plataforma distribuída para streaming de dados, que se tornou o padrão de facto para a construção de sistemas de troca de mensagens de alta carga. Ao desenvolver em Go (Golang), uma das bibliotecas mais populares e confiáveis para interagir com Kafka é a segmentio/kafka-go. Neste artigo, abordaremos em detalhes como instalar, configurar e usar esta biblioteca para criar produtores e consumidores.

\n\n

Por que segmentio/kafka-go?

\n\n

Existem várias bibliotecas Go para Kafka no mercado (por exemplo, Sarama e Confluent Go Client). A segmentio/kafka-go se destaca pelas seguintes vantagens:

\n\n
    \n
  • Go puro — não requer dependências C (ao contrário do Confluent), simplificando a compilação e implantação.
  • \n
  • Suporte ao Kafka Protocol v2 — compressão eficiente, batching e suporte a transações.
  • \n
  • API simples — interfaces intuitivas para produtores, consumidores e administração de tópicos.
  • \n
  • Comunidade ativa — atualizações regulares e boa documentação.
  • \n
\n\n

Instalação da biblioteca

\n\n

Para começar, adicione a biblioteca ao seu projeto usando go get:

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

Certifique-se de ter uma instância do Kafka em execução (localmente ou via Docker). Exemplo de configuração mínima com 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

Criando um produtor (Producer)

\n\n

O produtor envia mensagens para um tópico Kafka. Veja um exemplo 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    // Configuração do produtor\n    writer := &kafka.Writer{\n        Addr:     kafka.TCP("localhost:9092"),\n        Topic:    "test-topic",\n        Balancer: &kafka.LeastBytes{}, // Balanceamento por tamanho da mensagem\n        BatchSize: 10,                 // Enviar lote de 10 mensagens\n        BatchTimeout: 100 * time.Millisecond,\n    }\n    defer writer.Close()\n\n    // Envio de mensagem\n    err := writer.WriteMessages(context.Background(),\n        kafka.Message{\n            Key:   []byte("key-1"),\n            Value: []byte("Olá, Kafka do Go!"),\n        },\n    )\n    if err != nil {\n        log.Fatal("Erro ao enviar mensagem:", err)\n    }\n\n    fmt.Println("Mensagem enviada com sucesso")\n}
\n\n

Parâmetros chave do kafka.Writer:

\n
    \n
  • Addr — endereço do broker Kafka.
  • \n
  • Topic — nome do tópico.
  • \n
  • Balancer — estratégia de distribuição de mensagens entre partições (LeastBytes, RoundRobin, Hash).
  • \n
  • BatchSize e BatchTimeout — otimização de desempenho.
  • \n
\n\n

Criando um consumidor (Consumer)

\n\n

O consumidor lê mensagens de um tópico. Exemplo simples com gerenciamento 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    // Configuração do reader (consumidor)\n    reader := kafka.NewReader(kafka.ReaderConfig{\n        Brokers:   []string{"localhost:9092"},\n        Topic:     "test-topic",\n        GroupID:   "my-consumer-group",\n        MinBytes:  10, // Tamanho mínimo do lote\n        MaxBytes:  10e6, // 10 MB\n        StartOffset: kafka.FirstOffset, // Come                    

Recommendations