Kafka生成消息时的3种分区策略

发送消息时,需要指定发送到哪个分区,那么分区策略有哪些呢?今天我们来看看

使用分区策略配置:

1. 默认分区策略

全路径类名:org..kafka….

粘性分区

为什么会有粘性分区的概念?

首先,我们指定在发送消息时,将消息合二为一,这个Batch可能包含多条消息,然后将Batch打包发送。为此,请参阅我之前说明 Kafka 消息缓存模型的文章。

图片[1]-Kafka生成消息时的3种分区策略-唐朝资源网

这样做的好处是可以提高吞吐量,减少请求的数量。

但是有一个问题,因为消息是发送的,它必须在你的一个 Batch 已满或 .ms 时间到时发送。如果产生的消息较少,则很难填充 Batch,这意味着更高的延迟。

在之前的消息发送中,消息被轮询到每个分区。消息很少。如果给所有分区遍历分配,很难让每个分区都满足条件。

那么如果我做一个满了,然后分配给其他分区,这个延迟可以减少吗?

详情请看下图

这张图的前提是:

有3个分区。此时发送了9条没有key的消息,这9条消息的总和不超过batch.size。

那么前面的分配方式和粘性分区的分配方式如下

图片[2]-Kafka生成消息时的3种分区策略-唐朝资源网

可以看出,使用粘性分区后,至少有一批被填满发送,然后再填另一批。它不会像以前那样。虽然分布均匀,但一个 Batch 并不满,不能立即发送。这不会增加延迟(它只能在 .ms 时间到时发送)

专注于:

批量发送时,需要选择新的粘性分区

①。从所有可用分区中随机选择。

②。可用分区=1;然后直接选择这个分区。

③。可用分区 > 1 ; 然后在所有可用分区中随机选择。When the next is , it is not to the of . 但是随机性原则(当然和最后一个分区不一样)

例如,刚刚发送的batch是 1,当batch满时,发送后可能会向2或3发送新消息。如果选中的batch是2,2的batch满后,下一个选择的batch还是大概1,而不是说求平均,选择3个。

2.一个纯粘性分区策略

完整路径类名:org..kafka….oneer

他和分区策略的唯一区别是。

如果有key,则根据key确定分区,这次不使用粘性分区

oneer 的意思是不管你有没有key,都使用粘性分区统一分配。

3. r 分区策略

全路径类名:org..kafka….r

@Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        List partitions = cluster.partitionsForTopic(topic);
        int numPartitions = partitions.size();
        int nextValue = nextValue(topic);
        List availablePartitions = cluster.availablePartitionsForTopic(topic);
        if (!availablePartitions.isEmpty()) {
            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;
        }
    }

以上是具体代码。有一处要注意;

当可用分区为0时,则遍历所有分区。当有可用分区时,遍历所有可用分区。

点击关注,第一时间了解华为云新技术~

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容