发送消息时,需要指定发送到哪个分区,那么分区策略有哪些呢?今天我们来看看
使用分区策略配置:
1. 默认分区策略
全路径类名:org..kafka….
粘性分区
为什么会有粘性分区的概念?
首先,我们指定在发送消息时,将消息合二为一,这个Batch可能包含多条消息,然后将Batch打包发送。为此,请参阅我之前说明 Kafka 消息缓存模型的文章。
这样做的好处是可以提高吞吐量,减少请求的数量。
但是有一个问题,因为消息是发送的,它必须在你的一个 Batch 已满或 .ms 时间到时发送。如果产生的消息较少,则很难填充 Batch,这意味着更高的延迟。
在之前的消息发送中,消息被轮询到每个分区。消息很少。如果给所有分区遍历分配,很难让每个分区都满足条件。
那么如果我做一个满了,然后分配给其他分区,这个延迟可以减少吗?
详情请看下图
这张图的前提是:
有3个分区。此时发送了9条没有key的消息,这9条消息的总和不超过batch.size。
那么前面的分配方式和粘性分区的分配方式如下
可以看出,使用粘性分区后,至少有一批被填满发送,然后再填另一批。它不会像以前那样。虽然分布均匀,但一个 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时,则遍历所有分区。当有可用分区时,遍历所有可用分区。
点击关注,第一时间了解华为云新技术~
暂无评论内容