kafka消息分区原理
import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;
public class JasonPartitioner<T> implements Partitioner {
public JasonPartitioner(VerifiableProperties verifiableProperties) {}
@Override
public int partition(Object key, int numPartitions) {
try {
int partitionNum = Integer.parseInt((String) key);
return Math.abs(Integer.parseInt((String) key) % numPartitions);
} catch (Exception e) {
return Math.abs(key.hashCode() % numPartitions);
}
}
}
kafka的分区是根据消息发布的key,对分区数求余数得来
一般在kafka消息消费需要保证排序的,有两种方式,一种是创建消息topic时候,只创建一个分区,还有一种是,发布消息的时候把消息分成类型,把类型作为发布的key
比如一般我们在使用canal做mysql从库,消息发布的时候,相同的表名的数据,可以作为发布的key,这样消费者在拿到数据时候,不会再同步数据到es时产生错误