Kafka消息倾斜
今天发现一个Kafka消息倾斜的问题,小小记录一下
问题出现的原因:
我的topic有16个分区,我的用户id是uuid,整体是比较均匀的,对id做hash处理后然后对分区数量取模作为消息的key,最后发送Kafka消息使用如下方法:
@Overridepublic ListenableFuture<SendResult<K, V>> send(String topic, K key, @Nullable V data) {ProducerRecord<K, V> producerRecord = new ProducerRecord<>(topic, key, data);return doSend(producerRecord);}
最后发现16个分区中有7个分区没数据
我做了如下排查:首先找一批id做hash、取模计算,发现数据分布0~15很均匀,所以不是计算的问题,那问题就出现在Kafka上,以下是AI给我的Kafka分区机制:
所以相当于做了两次hash并且取模,导致数据倾斜,改进如下:
@Overridepublic ListenableFuture<SendResult<K, V>> send(String topic, Integer partition, K key, @Nullable V data) {ProducerRecord<K, V> producerRecord = new ProducerRecord<>(topic, partition, key, data);return doSend(producerRecord);}
直接使用指定分区的方法