kafka自定义分区,数据流向指定分区,消费者组的消费者消费指定分区(java)

业务场景参考

在IOT领域,传感器设备的数据向服务器发送数据,预想一个类型的数据放一个topic里,但是根据实际情况。

kaka的topic数越多,吞吐量性能下降厉害。

所以想象将分区做个自定义,然后消费者组的消费者消费指定分区,达到这一目的。

一 自定义kafka分区

public class SimplePartitioner implements Partitioner {
   
    private final AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public void configure(Map<String, ?> configs) {
   
        // TODO Auto-generated method stub

    }

    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
   
        // 从集群中获取所有分区信息,对key值进行分区
        List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
        //根据key进行分区 xx_01在01分区,xx_02在02分区
        int numPartitions = partitions.size();

        // key为null或空时使用轮训分区做负载均衡, 注意可以一定不能为null
        if (null == keyBytes || keyBytes.length < 1) {
   
            return atomicInteger.getAndIncrement() % numPartitions;
        }

        // 借用String的字符串计算方法,返回在哪个分区
        String strKey = key.toString();
        System.out.println(Integer.parseInt(strKey.split("_")[1]));
        return Integer.parseInt(strKey.split("_")[1]);



    }

    @Override
    public void close() {
   
        // TODO Auto-generated method stub

    }

}

二 生产者生产数据放到指定分区

public class TestPartitionProducer implements Serializable {
   

    private  KafkaProducer kafkaProducer;
    public final static String TOPIC_SPARKSTREAMING="TOPIC_SPARKSTREAMING_part1";

    /**
     * 初始化
     */
    {
   
        //1. 创建配置对象 指定Producer的信息
        Properties properties = new Properties();

        properties.put("acks", "1");
        //配置默认的分区方式 ☆☆☆这里指定我们自定义的分区
        properties.put("partitioner.class", "com.dahai.kafka.producer.SimplePartitioner");
        //配置topic的序列化类
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        //配置value的序列化类
        properties
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值