Kafka消息倾斜

今天发现一个Kafka消息倾斜的问题,小小记录一下

问题出现的原因:

我的topic有16个分区,我的用户id是uuid,整体是比较均匀的,对id做hash处理后然后对分区数量取模作为消息的key,最后发送Kafka消息使用如下方法:

java 复制代码
	@Override
	public 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并且取模,导致数据倾斜,改进如下:

java 复制代码
	@Override
	public 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);
	}

直接使用指定分区的方法