《面试1v1》Kafka消息是采用Pull还是Push模式

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪

🍅 技术交流:定期更新Java硬核干货,不定期送书活动

🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试

🍅 数十万人的面试选择: 面试说人话系列《面试1v1》

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


《面试1v1》 连载中...


面试官: 嗨,候选人!你知道Kafka消息系统是如何工作的吗?

候选人: 嗨,面试官!当然知道!Kafka是一个高吞吐量的分布式消息系统,它采用了Push和Pull的结合方式来实现消息传递。

面试官: 哦,那你能具体解释一下Kafka的Push和Pull模式吗?

候选人: 当然可以!在Kafka中,生产者(Producer)负责将消息推送(Push)到Kafka的Broker节点,而消费者(Consumer)则从Broker节点拉取(Pull)消息进行处理。

面试官: 很好!那你能给我们看一段简单的代码来说明这个过程吗?

候选人: 当然可以!让我给你展示一段Java代码来说明Kafka的Push和Pull模式:

java 复制代码
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class KafkaDemo {
    private static final String TOPIC = "my_topic";
    private static final String BOOTSTRAP_SERVERS = "localhost:9092";

    public static void main(String[] args) {
        // 生产者代码
        Properties producerProps = new Properties();
        producerProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
        producerProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        producerProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        Producer<String, String> producer = new KafkaProducer<>(producerProps);
        producer.send(new ProducerRecord<>(TOPIC, "Hello Kafka!"));

        // 消费者代码
        Properties consumerProps = new Properties();
        consumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
        consumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, "my_consumer_group");
        consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        Consumer<String, String> consumer = new KafkaConsumer<>(consumerProps);
        consumer.subscribe(Collections.singleton(TOPIC));
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
        for (ConsumerRecord<String, String> record : records) {
            System.out.println("Received message: " + record.value());
        }
    }
}

面试官: 太棒了!这段代码很好地展示了Kafka的Push和Pull模式。那么,你能解释一下代码中的关键部分吗?

候选人: 当然可以!在生产者部分,我们配置了Kafka的地址和序列化器,并使用producer.send()方法将消息推送到名为my_topic的主题中。而在消费者部分,我们配置了Kafka的地址、消费者组ID和反序列化器,并使用consumer.poll()方法从主题中拉取消息,然后进行处理。

面试官: 非常清晰明了!你对Kafka的Push和Pull模式有很好的理解。有没有什么需要注意的地方呢?

候选人: 当然有!在使用Kafka的Push模式时,生产者需要确保消息能够成功推送到Broker节点,而在使用Pull模式时,消费者需要定期拉取消息以确保不会错过任何重要的数据。

面试官: 非常好!你对Kafka的Push和Pull模式的理解非常到位。谢谢你的回答!

候选人: 非常感谢!我很高兴能够分享我的知识。如果还有其他关于Kafka或者任何其他技术的问题,我都会尽力帮助解答!

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


《面试1v1》 连载中...


🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

相关推荐
宇宙李13 分钟前
2024java面试-软实力篇
面试·职场和发展
重生之我要进大厂17 分钟前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
_祝你今天愉快20 分钟前
技术成神之路:设计模式(十四)享元模式
java·设计模式
计算机学姐1 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
小筱在线1 小时前
SpringCloud微服务实现服务熔断的实践指南
java·spring cloud·微服务
JustinNeil1 小时前
简化Java对象转换:高效实现大对象的Entity、VO、DTO互转与代码优化
后端
luoluoal1 小时前
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
java·vue.js·spring boot
ChinaRainbowSea1 小时前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
小游鱼KF1 小时前
Spring学习前置知识
java·学习·spring
扎克begod1 小时前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python