一、使用key的hash值来计算消息的分区号
public class HashPartitioner implements Partitioner {
/**
* 使用key的hash值来计算消息的分区号
* @param topic
* @param key
* @param keyBytes
* @param value
* @param valueBytes
* @param cluster
* @return
*/
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
//获取分区数量
Integer count = cluster.partitionCountForTopic(topic);
//获取key的hash执行取模运算
int number = key.toString().hashCode() % count;
return number;
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs) {
}
}
二、自定义随机分区器
/**
* 自定义随机分区器
* 1. 实现Partitioner接口
* 2. 重写partition方法
*/
public class RandParitioner implements Partitioner {
/**
* 计算当前消息的分区号
* @param topic
* @param key
* @param keyBytes
* @param value
* @param valueBytes
* @param cluster
* @return
*/
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
//先获取分区的数量
Integer count = cluster.partitionCountForTopic(topic);
//随机一个分区号,应该是一个0~count-1的自然数
int number = (int) (Math.random() * count);
return number;
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs) {
}
}
三、自定义一个轮询分区器
/**
* 自定义一个轮询分区器
*/
public class RoundPartitioner implements Partitioner {
//获取一个全局的计数器
private AtomicInteger atomic = new AtomicInteger();
//计算当前消息的分区号
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
//获取主题的分区数量
Integer count = cluster.partitionCountForTopic(topic);
//获取计数器上的自增值
int andIncrement = atomic.getAndIncrement();
//对分区数量取模运算,就可以得到 0,1,2,0,1,2.....轮询的效果
int i = andIncrement % count;
return i;
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> configs) {
}
}