当前位置: 首页 > news >正文

从零学习Kafka:生产者分区机制

分区的核心逻辑

在从零学习Kafka:集群架构和基本概念一文中,我们了解了 Kafka 中分区的概念,它的主要作用一个是支持系统的可伸缩性,另一个是负载均衡。

生产者在写入数据时,实际是要写入到指定的分区。换句话说分区是 Kafka 中消息组织的最基础的单位。除了做负载均衡外,分区还有一个作用就是保证业务消息的处理顺序。

当你调用producer.send(record)时,Kafka 需要先确定数据要写到哪个分区。具体逻辑如下:

  1. 如果显示指定了 Partition:直接把数据写到指定分区

  2. 如果没有显示指定 Partition,但指定了 Key:把数据写到 Key 所对应的分区

  3. 既没有指定 Partition,也没有指定 Key:使用 Kafka 的默认策略来分配数据

分区策略

到这里你可能想问,Kafka 到底是如何判断一条数据应该分配到哪个分区的呢?别急,我们现在就来介绍 Kafka 的分区策略。

按 Key 分配策略

如果我们在消息中指定了消息键,Kafka 会将相同 Key 的消息发送到相同的分区。具体方式是使用 murmur2 算法对 Key 进行 Hash,即abs(murmur2(key)) % numPartitions。这个策略是为了实现局部有序性。

轮询策略

如果没有指定 Key,在旧版本中,Kafka 默认使用的是轮询策略,也就是对消息按顺序分配。如下图第一条消息分配到 partition0,第二条消息分配到 partition1,第三条消息分配到 partition2。

轮询策略的好处就是负载非常均衡,它能最大限度保证消息被平均分配到所有分区上,但它的缺点也比较明显,这样分配会导致每个批次都很小,会有很多小请求,从而影响吞吐量。

粘性策略

为了解决轮询策略的问题,Kafka 又引入了新的分区策略——粘性策略。它的逻辑是消息默认跟随上一个消息的分区,直到批次被填满,或者等待时间到了。这样做的好处是可以极大的提高消息的批处理效率。

随机策略

旧版本的 Kafka 也支持随机策略,它的逻辑就是每次生成一个随机数,然后计算出对应的分区。这个策略本身的目的也是希望能做到负载均衡,但是实际效果不如轮询策略,因此在新版本中就不会使用了。

自定义策略

最后再介绍一下自定义策略,自定义分区策略的方法也很简单。只需要在自定义类中实现接口org.apache.kafka.clients.producer.Partitioner,然后在partition()方法中实现自己的分区逻辑。

partition 方法提供了很多入参,包括消息相关的 topic、key、keyBytes、value、valueBytes,也包括集群相关的 cluster。一般情况下这么多信息足够你计算出对应消息需要发送到哪个分区。

int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);

关键参数

介绍完了分区策略之后,我们再看几个分区相关的配置参数。

第一个是batch.size,在介绍粘性策略时,我们提到了批次填满时,消息会分配到新的分区。这个参数就是用来控制批次大小的,默认是 16KB,批次越大,吞吐量越高。

第二个参数是linger.ms,也是用于粘性策略的。它控制的是等待时间,默认是 0ms。生产环境可以设置成 5 - 100 ms。

总结

本文我们的视角从服务端过渡到了客户端,先从生产者的分区机制入手。了解了为什么需要分区,以及分区的几种策略,最后又介绍了两个配置参数。下一节我们将一起了解生产者端的性能提升利器——压缩。

分类: Kafka学习笔记

http://www.jsqmd.com/news/1075216/

相关文章:

  • 面试官问:“你怎么评估一个 Agent 到底好不好用?”,我笑了:“试了几个问题,没问题就行”,面试官:“你不叫评估,叫碰运气”
  • LSTM序列分类实战:门控机制、双向设计与工程调优指南
  • 终极指南:如何用DroneSecurity深度解析DJI无人机通信协议?
  • 《HarmonyOS技术精讲-UI开发 (基于NDK构建UI)》第4篇:高效Canvas绘制——NDK中的2D渲染加速
  • 一升主机跑百亿大模型:酷睿Ultra端侧AI实战指南
  • 磁盘空间告急?这个Rust工具帮你找出所有可以删的文件
  • 分钟看懂p值和置信区间:别再被_显著_忽悠了
  • 九大网盘直链下载助手完整指南:免费高速下载终极方案
  • MPC8360E内存控制器深度解析:SDRAM时序与UPM可编程接口实战
  • Bootstrap Tooltip XSS漏洞复现:从原理到防御的深度解析
  • 临床AI落地五大生死线:从模型可信度到人机协同的实战指南
  • hcip二层综合实验
  • LinkSwift终极指南:如何优雅获取九大网盘直链下载地址
  • Ghostty + Fish + Starship + fzf + zoxide + Raycast
  • UEditor远程文件抓取漏洞解析:从原理到修复的Web安全实战
  • 赛博朋克2077存档编辑器:彻底掌控夜之城的终极工具
  • AI领域每日资讯报告(2026年6月24日)
  • AI科研画图
  • Mac上使用VScode优雅开发STM32
  • LED光学测量对产品的品质重要性
  • TFRecord写入最佳实践:从数据序列化到生产级稳定性
  • CountDownLatch
  • Kubernetes RBAC 实战指南
  • Cloudflare 发起回源连接断开,连不上 443 端口的原因
  • 终极窗口调整指南:如何用WindowResizer轻松掌控任意窗口尺寸
  • 香港国际资源型EMBA实测解析与2026选型指南
  • 卡美德生物科普Noggin(诺金蛋白):解析发育与修复的核心调控机制
  • 2026降AI率工具红黑榜:降AI率网站怎么选?这份榜单够用!
  • 【C 语言项目实战】基于链表与文件操作的标准化彩票管理系统设计与实现
  • 从C到C++:从结构体到类,面向对象初体验