kafka topic消息分配partition规则
发布日期:2021-07-27 04:52:51
浏览次数:5
分类:技术文章
本文共 1711 字,大约阅读时间需要 5 分钟。
我们知道Kafka 的消息通过topic进行分类。topic可以被分为若干个partition来存储消息。消息以追加的方式写入partition,然后以先入先出的顺序读取。
下面是topic和partition的关系图:
我们一般会在server.conf中通过num.partitions参数指定创建topic时包含多少个partition。默认是num.partitions=1。既然一个topic有多个partition,那么消息是怎么样分配到partition的呢?
生产者生产一个消息send到topic分区器,分区器会根据消息里面的分区参数key值把消息分到对应的partition。这里就像我们快递代发网点一样,快递代发网点可以代理很多种快递公司,如果要寄快递者P(生产者)指定用什么快递公司,代发网点人员C(分区器)就会把该物品M(消息)归类到指定的快递公司区域存放。如果P不要求具体的快递公司寄件,那么就由C随意分配快递公司(哈哈,那就要看这个家伙的心情了,心情好点给你一个顺丰比较快到达,心情不好时就GG吧)。下面是Kafka对消息分配分区 DefaultPartitioner.java 类的核心代码:
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { Listpartitions = cluster.partitionsForTopic(topic); int numPartitions = partitions.size(); if (keyBytes == null) { int nextValue = counter.getAndIncrement(); List availablePartitions = cluster.availablePartitionsForTopic(topic); if (availablePartitions.size() > 0) { int part = Utils.toPositive(nextValue) % availablePartitions.size(); return availablePartitions.get(part).partition(); } else { // no partitions are available, give a non-available partition return Utils.toPositive(nextValue) % numPartitions; } } else { // hash the keyBytes to choose a partition return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions; } }
第4、7行:如果没有指定key值并且可用分区个数大于0时,在就可用分区中做轮询决定改消息分配到哪个partition。
第4、10行:如果没有指定key值并且没有可用分区时,在所有分区中轮询决定改消息分配到哪个partition。
第14行:如果指定key值,对key做hash分配到指定的partition。
所以当同一个key的消息会被分配到同一个partition中。消息在同一个partition处理的顺序是FIFO,这就保证了消息的顺序性。
转载地址:https://blog.csdn.net/qq_45292079/article/details/104482430 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年09月27日 07时29分07秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ie6兼容问题2——3像素间距
2019-06-06
简洁的JS实现Tab切换效果
2019-06-06
C# 使用Emit实现动态AOP框架 (三)
2019-06-06
第五次作业周总结
2019-06-06
个人报告04
2019-06-06
一次http完整的请求tcp报文分析
2019-06-06
iOS中sqlite和coreData的区别
2019-06-06
不能只延迟退休年龄而不辅之以综合性长远配套工程
2019-06-06
Android Context上下文解析
2019-06-06
第二章 向量(c)无序向量
2019-06-06
13_传智播客iOS视频教程_NSObject指针和id指针
2019-06-06
Silverlight 5 发布,新特性翻译及简单的特性解释
2019-06-06
TLE 中的教训
2019-06-06
[原]distcc源码研究五
2019-06-06
win21api、win32gui、win32con三个模块操作系统窗口时一些小技巧
2019-06-06
hbase伪分布式安装
2019-06-06
iOS去除字符串中的换行符
2019-06-06
Lazarus 中文汉字解决方案
2019-06-06