kafka中消息key作用与分区规则关系

在 kafka 2.0.0 的 java sdk 中

复制代码
<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka_2.12</artifactId>
	<version>2.0.0</version>
</dependency>

ProducerRecord 中类注释如下

A key/value pair to be sent to Kafka. This consists of a topic name to which the record is being sent, an optional partition number, and an optional key and value.

If a valid partition number is specified that partition will be used when sending the record. If no partition is specified but a key is present a partition will be chosen using a hash of the key. If neither key nor partition is present a partition will be assigned in a round-robin fashion.

The record also has an associated timestamp. If the user did not provide a timestamp, the producer will stamp the record with its current time. The timestamp eventually used by Kafka depends on the timestamp type configured for the topic.

If the topic is configured to use CreateTime, the timestamp in the producer record will be used by the broker.

If the topic is configured to use LogAppendTime, the timestamp in the producer record will be overwritten by the broker with the broker local time when it appends the message to its log.

In either of the cases above, the timestamp that has actually been used will be returned to user in RecordMetadata

说明了 key 与分区编号的关系

KafkaProducer 中会进行如下操作

partition 合法性校验

分区id大于等于集群中指定的主题的总数,抛出异常

分区计算

分区编号获取规则

如果 ProducerRecord 中 partition 字段不为空,则取对应的变量值,否则调用 Partitioner 的实现类 DefaultPartitioner 中进行分区id获取。

DefaultPartitioner 中分区id计算办法

如果 key 为 null,有两种情况

当前 topic 的可用分区数大于0

获取当前 topic 的计数器累加后的数字与可用分区数进行 mod 运算获取分区id。

当前 topic 的可用分区数小于等于0

获取当前 topic 的计数器累加后的数字与分区数进行 mod 运算获取分区id。即返回一个不可用的分区。看到这里的做法,也能理解,毕竟没有可用分区了,只能返回一个不可用分区了。

如果 key 不为 null

通过32bit的murmur2哈希算法生成一个分区编号与分区数量进行 mod 运算。

整理的流程图
kafka生产者消息分区规则

https://www.volcengine.com/theme/746069-K-7-1

https://zhuanlan.zhihu.com/p/485957664

相关推荐
搬砖柯2 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研2 小时前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
Kyrie_Li12 小时前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
格子软件13 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
Evand J21 小时前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
格子软件1 天前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
2301_801184751 天前
kafka-zookeeper
分布式·zookeeper·kafka
Devin~Y1 天前
抖音级短视频推荐与直播带货平台面试实战:从 Java 微服务到 RAG 智能客服全链路解析
java·spring boot·redis·spring cloud·kafka·agent·rag
大明者省1 天前
四大模态大模型训练体系全解析(架构+范式+分布式+算力成本·)
笔记·分布式·架构
格子软件1 天前
2026年分布式GEO代理架构:多租户动态数据源隔离与流控源码解构
java·vue.js·人工智能·分布式·架构·vue·geo