在 C# (.NET) 中使用 Apache Kafka:Confluent.Kafka 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

用于在 C# (.NET) 中操作 Apache Kafka 的 Confluent.Kafka 库



Apache Kafka 是一个分布式流数据处理平台,已成为构建事件驱动架构和微服务的标准。对于 C# (.NET) 开发者来说,最流行且受支持的库是 Confluent.Kafka——由 Confluent 公司提供的官方客户端,基于高性能 C 客户端 librdkafka 构建。在本文中,我们将详细介绍如何安装该库、创建生产者和消费者,并探讨最佳实践。



安装 Confluent.Kafka

首先,通过 NuGet 将包添加到项目中:

dotnet add package Confluent.Kafka

或者通过包管理器控制台:

Install-Package Confluent.Kafka


生产者 (Producer) 的基本配置

生产者将消息发送到 Kafka 主题。来看一个简单示例:

using Confluent.Kafka;

var config = new ProducerConfig{ BootstrapServers = "localhost:9092"};

using (var producer = new ProducerBuilder<string, string>(config).Build()){ var message = new Message<string, string> { Key = "user_123", Value = "你好,Kafka!" };

var deliveryReport = await producer.ProduceAsync("my-topic", message); Console.WriteLine($"消息已发送。分区: {deliveryReport.Partition}, 偏移量: {deliveryReport.Offset}");}


关键点:

  • BootstrapServers — 一个或多个 Kafka 代理的地址。
  • ProduceAsync — 异步发送并等待确认。
  • Key 可以保证同一键下消息的顺序性。


使用序列化处理复杂对象的生产者

通常需要发送 JSON 或二进制数据,而非字符串。使用自定义序列化器或 Newtonsoft.Json 库:

using System.Text.Json;using Confluent.Kafka;

var config = new ProducerConfig { BootstrapServers = "localhost:9092" };

var producer = new ProducerBuilder<string, Order>(config) .SetValueSerializer(new JsonSerializer<Order>()) .Build();

var order = new Order { Id = 1, Amount = 150.50m, Customer = "伊万" };await producer.ProduceAsync("orders", new Message<string, Order> { Key = order.Id.ToString(), Value = order });

public class Order{ public int Id { get; set; } public decimal Amount { get; set; } public string Customer { get; set; }}

public class JsonSerializer<T> : ISerializer<T>{ public byte[] Serialize(T data, SerializationContext context) => JsonSerializer.SerializeToUtf8Bytes(data);}


消费者 (Consumer) 的配置

消费者从一个或多个主题中读取消息。订阅与处理示例:

using Confluent.Kafka;

var config = new ConsumerConfig{ BootstrapServers = "localhost:9092", GroupId = "my-consumer-group", AutoOffsetReset = AutoOffsetReset.Earliest};

using (var consumer = new ConsumerBuilder<string, string>(config).Build()){ consumer.Subscribe("my-topic");

CancellationTokenSource cts = new CancellationTokenSource(); Console.CancelKeyPress += (_, e) => { e.Cancel = true; cts.Cancel(); };

try { while (true) { var consumeResult = consumer.Consume(cts.Token); Console.WriteLine($"已接收: Key={consumeResult.Message.Key}, Value={consumeResult.Message.Value}"); } } catch (OperationCanceledException) { consumer.Close(); }}


重要配置参数:

  • GroupId — 消费者组标识符。Kafka 在组内分配分区。

推荐