Trabalhando com Apache Kafka em C# (.NET): biblioteca Confluent.Kafka

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

Biblioteca Confluent.Kafka para trabalhar com Apache Kafka em C# (.NET)

\n\n

Apache Kafka é uma plataforma distribuída para streaming de dados, que se tornou padrão na construção de arquiteturas orientadas a eventos e microsserviços. Para desenvolvedores em C# (.NET), a biblioteca mais popular e suportada é a Confluent.Kafka — o cliente oficial da empresa Confluent, construído sobre o cliente C de alto desempenho librdkafka. Neste artigo, abordaremos em detalhes como instalar a biblioteca, criar um produtor e um consumidor, além de explorar as melhores práticas de trabalho.

\n\n

Instalação do Confluent.Kafka

\n

Para começar, adicione o pacote ao projeto via NuGet:

\n
dotnet add package Confluent.Kafka
\n

Ou através do console do gerenciador de pacotes:

\n
Install-Package Confluent.Kafka
\n\n

Configuração básica do produtor (Producer)

\n

O produtor envia mensagens para tópicos do Kafka. Veja um exemplo simples:

\n
using Confluent.Kafka;\n\nvar config = new ProducerConfig\n{\n    BootstrapServers = "localhost:9092"\n};\n\nusing (var producer = new ProducerBuilder<string, string>(config).Build())\n{\n    var message = new Message<string, string>\n    {\n        Key = "user_123",\n        Value = "Olá, Kafka!"\n    };\n\n    var deliveryReport = await producer.ProduceAsync("my-topic", message);\n    Console.WriteLine($"Mensagem enviada. Partition: {deliveryReport.Partition}, Offset: {deliveryReport.Offset}");\n}
\n\n

Pontos-chave:

\n
    \n
  • BootstrapServers — endereço de um ou mais brokers do Kafka.
  • \n
  • ProduceAsync — envio assíncrono com confirmação.
  • \n
  • A Key permite garantir a ordenação das mensagens por uma mesma chave.
  • \n
\n\n

Produtor com serialização de objetos complexos

\n

Frequentemente é necessário enviar não apenas strings, mas JSON ou dados binários. Use um serializador personalizado ou a biblioteca Newtonsoft.Json:

\n
using System.Text.Json;\nusing Confluent.Kafka;\n\nvar config = new ProducerConfig { BootstrapServers = "localhost:9092" };\n\nvar producer = new ProducerBuilder<string, Order>(config)\n    .SetValueSerializer(new JsonSerializer<Order>())\n    .Build();\n\nvar order = new Order { Id = 1, Amount = 150.50m, Customer = "João" };\nawait producer.ProduceAsync("orders", new Message<string, Order> { Key = order.Id.ToString(), Value = order });\n\npublic class Order\n{\n    public int Id { get; set; }\n    public decimal Amount { get; set; }\n    public string Customer { get; set; }\n}\n\npublic class JsonSerializer<T> : ISerializer<T>\n{\n    public byte[] Serialize(T data, SerializationContext context) =>\n        JsonSerializer.SerializeToUtf8Bytes(data);\n}
\n\n

Configuração do consumidor (Consumer)

\n

O consumidor lê mensagens de um ou mais tópicos. Exemplo de inscrição e processamento:

\n
using Confluent.Kafka;\n\nvar config = new ConsumerConfig\n{\n    BootstrapServers = "localhost:9092",\n    GroupId = "my-consumer-group",\n    AutoOffsetReset = AutoOffsetReset.Earliest\n};\n\nusing (var consumer = new ConsumerBuilder<string, string>(config).Build())\n{\n    consumer.Subscribe("my-topic");\n\n    CancellationTokenSource cts = new CancellationTokenSource();\n    Console.CancelKeyPress += (_, e) => { e.Cancel = true; cts.Cancel(); };\n\n    try\n    {\n        while (true)\n        {\n            var consumeResult = consumer.Consume(cts.Token);\n            Console.WriteLine($"Recebido: Key={consumeResult.Message.Key}, Value={consumeResult.Message.Value}");\n        }\n    }\n    catch (OperationCanceledException)\n    {\n        consumer.Close();\n    }\n}
\n\n

Parâmetros de configuração importantes:

\n
    \n
  • GroupId — identificador do grupo de consumidores. O Kafka distribui as partições entre

Recommendations