Apache Kafka 是一个高吞吐量、分布式、可扩展的流处理平台,用于构建实时数据管道和流应用程序。它最初由 LinkedIn 开发,并于 2011 年开源,目前由 Apache 软件基金会进行维护。
Kafka 具备以下核心特性:
Kafka 不仅是一个消息队列,更是一个用于流数据处理的统一平台。
Kafka 在大数据和分布式系统领域具有广泛应用,主要包括:
Kafka 可统一收集来自不同服务或服务器的日志,作为日志系统的核心组件,将数据传输至后端处理系统(如 Hadoop、Elasticsearch 等)。
结合 Apache Flink、Spark Streaming 等流处理框架,Kafka 可用于构建实时分析平台,实现实时用户行为分析、实时监控等。
Kafka 作为微服务架构中的事件总线,使服务之间通过事件解耦,从而提高系统灵活性与可维护性。
Kafka 能将数据从数据库、日志系统等源系统传输到数据仓库或数据湖,是构建高效可靠数据管道的核心工具。
在对吞吐量、可扩展性有更高要求的系统中,Kafka 可替代传统消息中间件(如 RabbitMQ、ActiveMQ)作为消息传递通道。
Kafka 的诞生源于 LinkedIn 内部对于日志处理和数据传输系统的性能瓶颈:
Kafka 在设计上融合了以下理念:
这一创新架构为 Kafka 后来的广泛应用打下了坚实基础,也推动了现代数据架构的演进。
好的!以下是 Kafka Java 快速入门指南,适合初学者快速了解如何在 Java 程序中使用 Kafka 实现消息的生产与消费。
明白了!以下是使用 Mermaid 格式图形 重新整理的 Kafka 集群搭建指南,清晰展示了 Kafka + ZooKeeper 的集群结构和搭建步骤。
wget https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0
config/zookeeper.properties
dataDir=/tmp/zookeeper
clientPort=2181
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
echo 1 > /tmp/zookeeper/myid # 节点1
echo 2 > /tmp/zookeeper/myid # 节点2
echo 3 > /tmp/zookeeper/myid # 节点3
bin/zookeeper-server-start.sh config/zookeeper.properties
每台机器修改 config/server.properties
,示例:
broker.id=1 # 每个节点唯一(如 1、2、3)
listeners=PLAINTEXT://192.168.1.101:9092
log.dirs=/tmp/kafka-logs-1
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
启动 Kafka:
bin/kafka-server-start.sh config/server.properties
bin/kafka-topics.sh --create \
--bootstrap-server 192.168.1.101:9092 \
--replication-factor 3 --partitions 3 \
--topic test-topic
bin/kafka-topics.sh --describe --topic test-topic --bootstrap-server 192.168.1.101:9092
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server 192.168.1.101:9092
bin/kafka-console-consumer.sh --topic test-topic --bootstrap-server 192.168.1.102:9092 --from-beginning
问题 | 原因 |
---|---|
Kafka 启动失败 | broker.id 重复或端口冲突 |
消息无法消费 | ZooKeeper 未正常连接,主题未正确创建 |
节点日志混乱或冲突 | log.dirs 配置重复,broker.id 没有区分 |
ZooKeeper 单点故障 | 节点不足,推荐部署奇数个节点(3/5) |
在你的项目的 pom.xml
中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.kafkagroupId>
<artifactId>kafka-clientsartifactId>
<version>3.6.0version>
dependency>
dependencies>
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
public class KafkaProducerDemo {
public static void main(String[] args) {
// 配置
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092"); // Kafka 地址
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
// 创建生产者
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
// 发送消息
for (int i = 0; i < 5; i++) {
String message = "Hello Kafka " + i;
producer.send(new ProducerRecord<>("test-topic", message));
System.out.println("Sent: " + message);
}
producer.close();
}
}
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
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");
props.put("auto.offset.reset", "earliest"); // 从头开始消费
// 创建消费者
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
// 订阅主题
consumer.subscribe(Collections.singletonList("test-topic"));
// 消费消息
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("Received message: key=%s, value=%s, offset=%d%n",
record.key(), record.value(), record.offset());
}
}
}
}
KafkaConsumerDemo
(等待监听)KafkaProducerDemo
(发送消息)9092
。test-topic
必须提前创建,或在 Kafka 开启 auto.create.topics.enable=true
的情况下自动创建。