分区策略:Kafka 主题和 Cosmos DB 容器

2025年5月16日 | 阅读 5 分钟

引言

分区是分布式系统中的一个基本概念,它能够实现可伸缩性和高可用性。在 Kafka 和 Cosmos DB 中,分区有助于在多个节点之间有效地分配工作负载,确保负载均衡和容错能力。

Kafka 分区策略

Kafka 使用分区来将消息分发到不同的代理(broker)上,从而确保并行处理和容错能力。分区允许多个消费者同时读取一个主题,从而提高吞吐量。

1. Kafka 分区基础

Apache Kafka 中,一个主题被划分为多个分区。每个分区都是一个独立的日志,这使得 Kafka 能够水平扩展。每个分区都存储在单独的 Kafka 代理上。

当生产者向 Kafka 主题发送消息时,Kafka 需要决定将消息写入哪个分区。分区策略决定了这个过程。

分区策略可以取决于各种因素,例如是否提供了键(key),是否使用了轮询(round-robin)分发,或者是否实现了自定义分区策略。

2. Kafka 分区策略

Kafka 支持不同的分区策略,如下所述:

a. 默认轮询分区

如果在发送消息时未提供键,Kafka 将以轮询的方式将消息分发到所有可用分区。

Code Example

此代码演示了默认的轮询分区。

输出

Partitioning Strategies: Kafka Topics and Cosmos DB Containers

在此示例中,由于未提供键,Kafka 将以轮询的方式将消息分发到各个分区。

b. 基于键的分区

如果您希望具有相同键的所有消息发送到同一个分区,您可以提供一个键。Kafka 使用该键计算一个哈希值,该哈希值决定了分区。

Code Example

输出

Partitioning Strategies: Kafka Topics and Cosmos DB Containers

c. 自定义分区

如果默认分区策略或基于键的分区策略不够用,您可以通过创建自己的分区器来实现自定义分区策略。您可以扩展 Partitioner 接口并实现 partition 方法。

Code Example

输出

Partitioning Strategies: Kafka Topics and Cosmos DB Containers

在此示例中,我们创建了一个 CustomPartitioner 类,它实现了 Partitioner 接口。partition 方法包含自定义逻辑,该逻辑根据消息的键(或任何其他逻辑)来计算分区号。

在生产者配置中,我们将 PARTITIONER_CLASS_CONFIG 指向我们的 CustomPartitioner 类。

Kafka 分区实践

带有基于键的分区的 Kafka 生产者

预期输出

Partitioning Strategies: Kafka Topics and Cosmos DB Containers

在此,具有相同键(artist)的消息被发送到同一个分区。

Cosmos DB 分区策略

Azure Cosmos DB 也会将数据分区到多个物理分区,以确保可伸缩性和性能。

1. Cosmos DB 分区基础

Cosmos DB 使用分区键对数据进行分区,分区键决定了数据的分布方式。

2. 选择合适的分区键

选择一个最优的分区键对于数据的均匀分布和查询性能至关重要。好的分区键具有:

  • 高基数(许多唯一值)
  • 在分区之间均匀分布
  • 最小化跨分区查询

3. 示例:Cosmos DB 分区

预期输出

Partitioning Strategies: Kafka Topics and Cosmos DB Containers

在此,artist 被用作分区键,确保了数据的均匀分布。

比较 Kafka 和 Cosmos DB 的分区策略

分区键可选(默认:轮询)强制性
负载分发基于键或轮询基于分区键
查询优化消费者读取特定分区跨分区查询会影响性能
可扩展性更多分区 = 更高的并行度更多分区 = 更好的性能