Kafka笔记
Kafka笔记
简介
Kafka是一个分布式流处理平台,最初由LinkedIn公司开发,现已成为Apache软件基金会的顶级项目。它具有高吞吐量、低延迟和可靠性等特点,适合用于处理大量数据的场景。Kafka主要由三个组件构成:Producer、Broker和Consumer。
依赖Zookeeper的安装配置
安装Zookeeper
Kafka依赖Zookeeper进行集群管理和协调。可以通过以下步骤安装Zookeeper:
- 下载Zookeeper:可以在Zookeeper的官方网站下载最新版本的Zookeeper。
- 解压缩文件:将下载的文件解压缩到合适的目录下。
- 配置文件:进入解压缩后的目录,复制
conf/zoo_sample.cfg
为conf/zoo.cfg
,并编辑conf/zoo.cfg
文件。 - 启动Zookeeper:执行
bin/zkServer.sh start
命令启动Zookeeper。
安装Kafka
可以通过以下步骤安装Kafka:
- 下载Kafka:可以在Kafka的官方网站下载最新版本的Kafka。
- 解压缩文件:将下载的文件解压缩到合适的目录下。
- 配置文件:进入解压缩后的目录,编辑
config/server.properties
文件,设置以下参数:
broker.id=0
listeners=PLAINTEXT://:9092
log.dirs=/tmp/kafka-logs
zookeeper.connect=localhost:2181
其中,broker.id
是Kafka集群中的唯一标识,listeners
指定Kafka监听的协议和端口,log.dirs
指定Kafka存储数据的目录,zookeeper.connect
指定Zookeeper的地址。
- 启动Kafka:执行
bin/kafka-server-start.sh config/server.properties
命令启动Kafka。
Shell命令
Kafka提供了一系列的Shell命令,用于管理Kafka集群,例如:
- 创建Topic:执行
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
命令创建名为test
的Topic。 - 发送消息:执行
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
命令发送消息到名为test
的Topic。 - 接收消息:执行
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
命令接收名为test
的Topic中的消息。
Java操作Kafka
Kafka提供了Java客户端API,可以在Java程序中操作Kafka集群。以下是一个简单的Java程序,用于发送消息到名为test
的Topic:
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
public class KafkaProducerExample {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
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 < 10; i++) {
producer.send(new ProducerRecord<>("test", Integer.toString(i), Integer.toString(i)));
}
producer.close();
}
}
以下是一个简单的Java程序,用于接收名为test
的Topic中的消息:
以下是一个简单的Java程序,用于接收名为`test`的Topic中的消息:
```java
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;
public class KafkaConsumerExample {
public static void main(String[] args) {
Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("test"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received message: " + record.value());
}
}
}
}
不依赖Zookeeper的安装配置
Kafka也可以在不依赖Zookeeper的情况下运行,通过使用Kafka内置的分布式协议来实现集群管理和协调。以下是不依赖Zookeeper的安装配置步骤:
安装Kafka
- 下载Kafka:可以在Kafka的官方网站下载最新版本的Kafka。
- 解压缩文件:将下载的文件解压缩到合适的目录下。
- 配置文件:进入解压缩后的目录,编辑
config/server.properties
文件,设置以下参数:
broker.id=0
listeners=PLAINTEXT://:9092
log.dirs=/tmp/kafka-logs
其中,broker.id
是Kafka集群中的唯一标识,listeners
指定Kafka监听的协议和端口,log.dirs
指定Kafka存储数据的目录。
- 启动Kafka:执行
bin/kafka-server-start.sh config/server.properties
命令启动Kafka。
Shell命令
Kafka提供了一系列的Shell命令,用于管理Kafka集群,例如:
- 创建Topic:执行
bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --replication-factor 1 --partitions 1 --topic test
命令创建名为test
的Topic。 - 发送消息:执行
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
命令发送消息到名为test
的Topic。 - 接收消息:执行
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
命令接收名为test
的Topic中的消息。
Java操作Kafka
Kafka提供了Java客户端API,可以在Java程序中操作Kafka集群。以下是一个简单的Java程序,用于发送消息到名为test
的Topic:
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
public class KafkaProducerExample {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
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);
String topic = "test";
String message = "hello, kafka!";
ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);
producer.send(record);
producer.close();
}
}
Kafka与其他中间件的对比
Kafka与其他消息队列和流处理平台相比,具有以下优点:
-
高吞吐量:Kafka可以在高并发场景下处理大量的数据。
-
高可靠性:Kafka使用多副本机制,确保消息的可靠性和持久性。
-
高可扩展性:Kafka支持分布式集群架构,并且可以很容易地扩展节点数量,以应对更高的负载。
-
灵活的数据保留策略:Kafka可以根据配置保留消息的时间或者保留消息的数量,同时也支持按照消息的键进行保留。
-
多语言支持:Kafka提供了多种语言的客户端API,方便开发者在不同的编程语言中使用Kafka。
与其他中间件相比,Kafka的缺点主要是在实时性方面相对较差。因为Kafka是基于磁盘的存储系统,所以在数据写入磁盘之前会有一定的延迟,不适合实时性要求比较高的应用场景。
使用场景
Kafka可以广泛应用于以下场景:
- 数据采集:Kafka可以作为数据采集的消息队列,接收多种类型的数据,包括日志、指标、事件等,同时也支持各种数据格式。
- 数据传输:Kafka可以作为数据传输的中间件,将数据从一个系统传输到另一个系统,支持多种协议和编码方式。
- 流处理:Kafka可以与流处理平台集成,如Apache Flink、Apache Spark等,支持实时数据处理和流计算。
- 事件驱动架构:Kafka可以作为事件驱动架构的消息中间件,将不同的事件封装成消息,传递给不同的服务进行处理。
常见问题
以下是一些使用Kafka过程中的常见问题和解决方法:
- Topic不存在:在使用Kafka命令行工具或者Java客户端API时,如果指定的Topic不存在,会抛出异常或者错误。解决方法是在Kafka集群中创建该Topic。
- Producer发送消息失败:在使用Java客户端API时,如果发送消息失败,可以检查Kafka集群是否正常运行,并检查Producer的配置参数是否正确。
- Consumer接收消息失败:在使用Java客户端API时,如果接收消息失败,可以检查Kafka集群是否正常运行,并检查Consumer的配置参数是否正确。
- 集群扩展:如果Kafka集群的负载增加,需要扩展集群规模,可以通过添加新的节点来实现,同时也需要重新配置一些参数。
优化方案
以下是一些Kafka性能优化的方案:
-
调整参数:Kafka有很多可以调整的参数,如消息大小、批处理大小、缓存大小等,可以根据实际场景进行调整。
-
分区策略:Kafka的性能和可扩展性与分区数量直接相关,可以根据实际情况适当增加分区数量,以提高性能。
-
使用压缩算法:Kafka支持多种压缩算法,如Gzip、Snappy等,可以使用压缩算法来减小消息的大小,提高传输效率。
-
合理使用缓存:Kafka可以将消息缓存在内存中,以提高读写性能,但是也需要注意缓存的大小和使用方法,避免内存占用过大或者读写性能下降。
-
优化磁盘性能:Kafka是基于磁盘的存储系统,优化磁盘性能可以提高Kafka的写入和读取速度,如使用SSD磁盘、RAID等。
Docker部署单机版Kafka
以下是使用Docker部署单机版Kafka的步骤:
1. 安装Docker和Docker Compose。
2. 创建一个docker-compose.yml文件,并添加以下内容:
```shell
version: '3'
services:
zookeeper:
image: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
```
1. 在终端中执行以下命令启动Kafka和Zookeeper容器:
```shell
docker-compose up -d
```
1. 使用以下命令测试Kafka是否正常运行:
```shell
docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
```
1. 使用以下命令发送一条测试消息:
```shell
docker exec -it kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
```
1. 使用以下命令接收测试消息:
```shell
docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
```
以上就是使用Docker部署单机版Kafka的简单步骤,可以快速搭建一个本地的Kafka环境。
结语
Kafka作为一种高性能、可靠的分布式消息中间件,广泛应用于数据采集、数据传输、流处理和事件驱动架构等场景。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理