💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 生产者消息分区机制 ## 背景需求 * 希望数据能够均匀地分配到所有 Broker ## 为什么分区 * Kafka 消息组织结构的三层结构:Topic - Partition - Record ![](https://img.kancloud.cn/18/e4/18e487b7e64eeb8d0a487c289d83ab63_422x273.png) * 分区的目的:提供负载均衡的能力,i.e. 系统的高伸缩性(Scalability) * 不同的分区能够放在不同的节点,数据的读写以分区粒度进行 * 因此可以增加节点机器来增加系统吞吐 * 不同系统分区的叫法 * Kafka:Partition 分区 * MongoDB / ElasticSearch:Shard 分片 * HBase:Region * Cassandra:vnode * 它们底层的思想都是 Partitioning ## 分区策略 * 分区策略:决定生产者将消息发送到哪个分区的算法 * 自定义分区策略 * 配置 Producer 的参数:partitioner.class * 实现:编写一个具体的类实现 `org.apache.kafka.clients.producer.Partitioner` 接口 * 该接口只定义了两个方法:partition(), close() ``` int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster); ``` * 充分利用参数对信息计算,将其发到哪个分区 ### 常见分区策略 * 轮询策略,i.e. Round-robin 策略 * 顺序分配 * 默认分区策略 * 随机策略,i.e. Randomness 策略 * 按消息键保序策略,i.e. Key-ordering 策略 * 每条消息定义消息键,i.e. Key * 默认分区策略有两种 * 如果没指定 Key,则是轮询策略 * 否则是 Key-ordering 策略 ### 其他分区策略 * 基于地理位置的分区策略 * e.g. 跨城市大规模 Kafka 集群 ## 其他 * Kafka 中同一个 Topic 不保证消息顺序性,但是 Topic 下同一个 Partition 是保障顺序性的