Kafka消息生产消费的一个java小案例(伪分布)

本文介绍了一个简单的Kafka实例,包括生产者和消费者的实现方式。生产者通过循环发送消息到指定主题,而消费者则订阅该主题并打印接收到的消息。本文还讨论了Kafka的基本概念,如组消费和偏移量设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是传智播客hadoop八天-第七天学习笔记

个人感觉kafka有点像JMS的点对点模式,都是一个生产者一个(组)消费者,消息被一个(组)消费者消费以后,其他(组)消费者就无法查看消息。
生产者:

package cn.kafka;

import java.util.Properties;

import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class ProducerDemo {

    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.put("zk.connect", "localhost:2181");
        props.put("metadata.broker.list", "localhost:9092");
        props.put("serializer.class", "kafka.serializer.StringEncoder");

        ProducerConfig config = new ProducerConfig(props);
        Producer<String, String> producer = new Producer<String, String>(config);

        for (int i = 1; i <= 1000; i++) {
            Thread.sleep(200);
            producer.send(new KeyedMessage<String, String>("order",
                    "the message no is" + i));
        }

    }

}

消费者

package cn.kafka;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.message.MessageAndMetadata;

public class ConsumerDemo {

    private static final String topic = "order";

    private static final Integer threads = 1;

    public static void main(String[] args) {
        Properties props = new Properties();
        //在这里使用zk.connect会报错,这是为什么呢?明明生产者用的就是zk.connect
        props.put("zookeeper.connect", "localhost:2181");
        // 若干个消费者为一个组,这个组消费的消息别的组是无法查看的。
        props.put("group.id", "1111");
        // 偏移量,smallest指将指针指向topic最起始的位置
        props.put("auto.offset.reset", "smallest");

        ConsumerConfig config = new ConsumerConfig(props);
        // 创建java连接
        ConsumerConnector consumer = Consumer
                .createJavaConsumerConnector(config);
        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
        //可以定义多个topic
        topicCountMap.put(topic, threads);
        topicCountMap.put("topic1", threads);
        topicCountMap.put("topic2", threads);


        Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer
                .createMessageStreams(topicCountMap);
        //可以取出任意topic的消息
        List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);

        for (final KafkaStream<byte[], byte[]> kafkaStream : streams) {
            new Thread(new Runnable() {

                public void run() {

                    for (MessageAndMetadata<byte[], byte[]> mm : kafkaStream) {
                        String msg = new String(mm.message());
                        System.out.println(msg);
                    }

                }
            }).start();

        }

    }

}
<think>好的,我需要回答用户关于Kafka的主要功能、应用场景以及提供一个Java实现的示例代码的问题。用户还提到要准备面试,所以回答需要结构清晰且可靠。首先,我应该回忆Kafka的核心功能,比如高吞吐量、分布式架构、持久化存储等。然后应用场景方面,用户之前提到的日志收集与分析、微服务通信都是重点,可以参考之前的引用内容。 接下来是Java代码示例。需要展示生产者和消费者的基本实现,使用KafkaJava客户端库。要确保代码简洁,适合面试中快速理解。还要注意代码注释和关键配置,比如服务器地址、序列化类等。另外,用户提供的引用中提到了Kafka在日志收集中的使用和配置优化,可以适当提及,但代码示例可能不需要太复杂,基础即可。 还要考虑生成相关问题,帮助用户深入理解。问题可以涉及Kafka的高吞吐原理、保证数据可靠性的机制、与其他消息队列的区别,以及性能优化方法。这些问题都是面试常见题,能帮助用户全面准备。 最后,检查是否符合格式要求:行内公式用$...$,独立公式用$$...$$,但这里可能用不上数学公式,所以主要注意代码块和引用标记。确保引用正确,比如引用[^1]对应日志收集的场景,引用[^4]可能与并发或性能优化相关,但需要合理关联。 现在整理内容,确保结构清晰,分点回答,代码正确,并自然插入引用。</think>### Kafka主要功能及核心特性 1. **高吞吐量** Kafka通过顺序磁盘I/O和批量处理实现每秒百万级消息处理,支持横向扩展集群$^{[与引用1相关设计]}$。 2. **持久化存储** 消息按分区持久化存储在磁盘,保留策略可配置(如按时间或大小清理)。 3. **分布式架构** 支持多副本机制,通过ISR(In-Sync Replicas)实现故障自动转移,保障高可用性$^{[类似引用2的分布式锁设计]}$。 4. **流式处理** 与Kafka Streams集成,支持实时数据转换和聚合。 --- ### 典型应用场景 1. **日志收集与分析** 统一收集多服务日志,配合ELK(Elasticsearch, Logstash, Kibana)实现实时分析。 2. **微服务通信** 解耦服务间的异步通信,如订单系统与库存系统的消息传递$^{[引用1的微服务架构案例]}$。 3. **实时流处理** 电商实时用户行为分析、金融交易监控等场景。 --- ### Java代码示例:生产者与消费者 #### 1. 生产者发送消息 ```java import org.apache.kafka.clients.producer.*; public class KafkaProducerDemo { public static void main(String[] args) { // 配置生产者参数 Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 创建生产者实例 Producer<String, String> producer = new KafkaProducer<>(props); // 发送消息(异步) ProducerRecord<String, String> record = new ProducerRecord<>("test-topic", "key1", "Hello Kafka!"); producer.send(record, (metadata, exception) -> { if (exception == null) { System.out.printf("消息发送成功: topic=%s, partition=%d, offset=%d%n", metadata.topic(), metadata.partition(), metadata.offset()); } else { exception.printStackTrace(); } }); producer.close(); // 关闭连接 } } ``` #### 2. 消费者接收消息 ```java import org.apache.kafka.clients.consumer.*; public class KafkaConsumerDemo { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); Consumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("test-topic")); try { while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("收到消息: key=%s, value=%s, partition=%d, offset=%d%n", record.key(), record.value(), record.partition(), record.offset()); } } } finally { consumer.close(); } } } ``` --- ### 面试扩展问题 1. **Kafka如何通过分区(Partition)实现高并发处理?** (考察负载均衡与并行消费机制) 2. **Kafka的副本同步机制如何保证数据可靠性?** (需解释ISR列表和ACK应答配置) 3. **Kafka与RocketMQ的核心差异是什么?** (对比设计理念、吞吐量、延迟等指标) 4. **如何优化Kafka生产者的发送性能?** (可答`linger.ms`批量发送、压缩算法选择等$^{[引用4的伪共享优化类似思路]}$) --- ### 关键配置说明 | 配置项 | 作用说明 | |-----------------------|----------------------------------| | `acks=all` | 确保所有副本写入成功 | | `retries=3` | 生产自动重试次数 | | `compression.type=lz4`| 使用LZ4压缩减少网络传输量 | | `max.poll.records=500`| 消费者单次拉取最大消息数 | 通过以上知识点和代码示例,可以系统展示对Kafka的理解及实际编码能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值