请问为什么callback比async要快?

来源:5-4 Producer异步回调发送演示

weixin_慕工程3031370

2020-06-16

发了10000个数据

结果
callback total time :167
async total time :487

    void asyncSend() throws ExecutionException, InterruptedException {
        Producer<String, String> producer = initProducer();

        //producer record
        long in = System.currentTimeMillis();
        for(int i = 0 ;  i< 10000; i++) {
            ProducerRecord<String, String> record =
                    new ProducerRecord<String, String>(TOPIC_NAME,"key-"+i, "sync "+System.currentTimeMillis());

            Future<RecordMetadata> send = producer.send(record);
//            System.out.println(send.get().toString());
        }
        long out = System.currentTimeMillis();
        System.out.println("async total time :" + (out - in));
    }

    void callBackSend() throws ExecutionException, InterruptedException {
        Producer<String, String> producer = initProducer();
        //producer record

        long in = System.currentTimeMillis();
        for(int i = 0 ;  i< 10000; i++) {
            ProducerRecord<String, String> record =
                    new ProducerRecord<String, String>(TOPIC_NAME,"key-"+i, "async "+System.currentTimeMillis());

            Future<RecordMetadata> send = producer.send(record, new Callback() {
                @Override
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
//                    System.out.println("partition: " + recordMetadata.partition());
                }
            });
        }

        long out = System.currentTimeMillis();
        System.out.println("callback total time :" + (out - in));
    }

我本来预计两个应该差不多的

写回答

1回答

Allen

2020-06-17

Future本来是异步执行, 但是你的async调用了get(), 相当于变成了阻塞调用啊

2
0

Kafka多维度系统精讲,从入门到实战开发

系统讲解Kafka,实战结合,让你成为使用Kafka的高手

896 学习 · 237 问题

查看课程