《面试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

相关推荐
乌啼霜满天249几秒前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn6 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟6 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy16 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
新知图书17 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
弗锐土豆23 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239124 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
盛夏绽放39 分钟前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
小小大侠客41 分钟前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
一二小选手44 分钟前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis