前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kafka topic消息分配partition规则(Java源码)

kafka topic消息分配partition规则(Java源码)

作者头像
GreizLiao
发布2019-09-23 15:24:33
8110
发布2019-09-23 15:24:33
举报

我们知道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 类的核心代码:

 1     public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
 2         List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
 3         int numPartitions = partitions.size();
 4         if (keyBytes == null) {
 5             int nextValue = counter.getAndIncrement();
 6             List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
 7             if (availablePartitions.size() > 0) {
 8                 int part = Utils.toPositive(nextValue) % availablePartitions.size();
 9                 return availablePartitions.get(part).partition();
10             } else {
11                 // no partitions are available, give a non-available partition
12                 return Utils.toPositive(nextValue) % numPartitions;
13             }
14         } else {
15             // hash the keyBytes to choose a partition
16             return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
17         }
18     }

第4、7行:如果没有指定key值并且可用分区个数大于0时,在就可用分区中做轮询决定改消息分配到哪个partition。

第4、10行:如果没有指定key值并且没有可用分区时,在所有分区中轮询决定改消息分配到哪个partition。

第14行:如果指定key值,对key做hash分配到指定的partition。

所以当同一个key的消息会被分配到同一个partition中。消息在同一个partition处理的顺序是FIFO,这就保证了消息的顺序性。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档