惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
Vercel News
Vercel News
D
Docker
博客园 - 聂微东
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
美团技术团队
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
T
The Blog of Author Tim Ferriss
GbyAI
GbyAI
N
Netflix TechBlog - Medium
G
Google Developers Blog
腾讯CDC

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
从零学习Kafka:生产者分区机制
Jackeyzhe · 2026-04-28 · via 博客园_首页

在前面的文章中,我们主要学习了 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。这个策略是为了实现局部有序性。

partitionkey

轮询策略

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

partitionround

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

粘性策略

为了解决轮询策略的问题,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。

总结

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