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

相关推荐
胡萝卜术30 分钟前
RAG 的知识炼油厂:从原始网页到可检索知识块的工程化之路
面试·架构·github
GoGeekBaird31 分钟前
我用 BeeWeave 跑完了一次完整写作闭环
后端·github
wdfk_prog35 分钟前
嵌入式面试真题第 11 题:RTOS 优先级翻转与实时任务阻塞的通用治理
c语言·缓存·面试·职场和发展·架构
这个DBA有点耶1 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
仿生狮子2 小时前
别再说“全栈”了,AI 时代团队只认这 5 种人
前端·人工智能·后端
csdn2015_2 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky3 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
Reart4 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
云云只是个程序马喽4 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
触底反弹4 小时前
🔥 RAG 到底是怎么工作的?掰开揉碎了给你讲明白!
javascript·人工智能·后端