【博学谷学习记录】超强总结,用心分享|Kafka的Java API 与Kafka的分片、副本机制
一、Kafka的Java API
1.1 创建一个Maven的项目, 导入相关的依赖
<repositories><!--代码库-->
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>
1.2 生产者代码:将数据生产到Kafka
package com.itheima.kafka.producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
public class KafkaProducerTest {
public static void main(String[] args) {
// 第一步: 创建Kafka的生产者核心类对象: KafkaProducer 并传入相关的配置
Properties props = new Properties();
props.put("bootstrap.servers", "node1:9092,node2:9092,node3:9092"); // 连接地址
props.put("acks", "all"); // 消息确认方案 all 是最高级别
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // key的数据类型 及其序列化类
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // value的数据类型 及其序列化类
Producer<String, String> producer = new KafkaProducer<>(props);
// 第二步: 执行发送数据操作
for (int i = 0; i < 10; i++) {
// 生产者的核心数据承载对象
ProducerRecord<String, String> producerRecord = new ProducerRecord<>("test01",Integer.toString(i));
producer.send(producerRecord);
}
// 第三步: 关闭生产者对象
producer.close();
}
}
1.3 消费者代码:消费Kafka中的数据
package com.itheima.kafka.consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;
// 演示消费端的代码实现
public class KafkaConsumerTest {
public static void main(String[] args) {
// 第一步: 创建消费者的核心对象: KafkaConsumer 并添加配置信息
Properties props = new Properties();
props.setProperty("bootstrap.servers", "node1:9092,node2:9092,node3:9092"); // 指定kafka的集群地址
props.setProperty("group.id", "test"); // 指定消费者组
props.setProperty("enable.auto.commit", "true"); // 是否开启自动提交消息偏移量
props.setProperty("auto.commit.interval.ms", "1000"); // 自动提交消息偏移量的间隔时间
props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // key的反序列化类型
props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // value反序列化类型
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
// 第二步: 指定监听那些topic中数据 (支持多个一起监听)
consumer.subscribe(Arrays.asList("test01"));
while (true) { // 不断监听, 持续一直监听
// 第三步: 从kafka中获取消息数据, 参数表示当kafka中没有消息的时候,等待的超时时间, 如果过了这个等待超时时间, 返回 空对象(对象是存在的, 但是内部没有任何的数据, 相当于空容器)
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
long offset = record.offset(); // 获取消息偏移量
String key = record.key(); // 获取消息的key值
String value = record.value(); // 获取消息的value值
int partition = record.partition(); // 获取消息从那个分片来
System.out.println("消息的偏移量为:"+ offset +"; 消息所属分片:"+partition +";消息的key值:"+key+";消息的value:"+value);
}
}
}
}
二、Kafka的分片、副本机制
2.1 什么是Kafka的分片?
分片: 逻辑概念
相当于将一个Topic(大容器)拆分为N多个小容器, 多个小的容器构建为一个Topic
目的:
1- 提高读写的效率: 分片可以分布在不同节点上, 在进行读写的时候, 可以让多个节点一起参与(提高并行度)
2- 分布式存储: 解决了单台节点存储容量有限的问题
分片的数量:分片是可以创建N多个, 理论上没有任何的限制
2.2 什么是Kafka的副本?
副本: 物理的概念
针对每个分片的数据, 可以设置备份, 可以将其备份多个
目的:
提高数据的可靠性, 防止数据丢失
副本的数量: 副本的数量最多和集群节点数量保持一致, 但是一般设置为 2个 或者 3个