一、Kafka概述
Kafka是一款流處理平台,提供一套完整的高吞吐、低延遲的數據發佈和訂閱服務。它可以處理TB級的數據,支持分佈式、高可用的集群部署。
一個Kafka集群由多個Broker節點組成,每個Broker節點負責一部分數據的存儲和處理。一個Kafka Topic可以由多個Partition組成,每個Partition可以按照Offset順序存儲數據。消費者可以按照Partition的順序讀取數據,實現高並發的數據處理和分發。
以下是一個Java Producer和Consumer的基本實現:
public class KafkaProducerDemo {
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");
Producer<String, String> producer = new KafkaProducer(props);
for(int i = 0; i < 100; i++)
producer.send(new ProducerRecord<>("test", Integer.toString(i), Integer.toString(i)));
producer.close();
}
}
public class KafkaConsumerDemo {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singleton("test"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n",
record.offset(), record.key(), record.value());
}
}
}
二、Kafka數據存儲
Kafka的數據存儲分為兩部分:索引文件和日誌文件。索引文件記錄每個消息的Offset和存儲位置,在讀取消息時可以快速查找對應的存儲位置;日誌文件記錄實際的消息內容,在寫入和讀取消息時通過內存映射技術提高了IO的效率。
以下是一個簡單的Topic創建和數據寫入的Java實現:
public class KafkaTopicDemo {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
AdminClient adminClient = AdminClient.create(props);
List<NewTopic> newTopics = new ArrayList<>();
newTopics.add(new NewTopic("test", 1, (short) 1));
adminClient.createTopics(newTopics);
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();
}
}
三、Kafka數據發佈和消費
Kafka提供了多種數據發佈和消費的API,包括Java、Python、C++等各種編程語言的客戶端API,以及各種流處理框架的集成API。
以下是一個基於Spring Boot的Kafka Consumer實現:
@Service
public class KafkaConsumerService {
@KafkaListener(topics = "test")
public void listen(ConsumerRecord<String, String> record) {
System.out.printf("offset = %d, key = %s, value = %s%n",
record.offset(), record.key(), record.value());
}
}
也可以通過Kafka的Web控制台來查看和管理Topic和消息:
KAFKA_HOME/bin/kafka-console-consumer.sh --topic test --bootstrap-server localhost:9092 --from-beginning
四、Kafka性能優化
為了提高Kafka的性能和可靠性,需要進行一系列的參數調優和系統優化。主要包括以下幾個方面:
1.硬件資源調優:優化磁盤IO、內存佔用和CPU利用率。
2.Kafka參數調優:調整Kafka的參數,包括Broker節點數量、Partition數量、Batch Size、Message Compression等。
3.消息生產和消費優化:優化Producer和Consumer的實現,包括加入批量發送、壓縮等優化。
以下是一些常見的Kafka參數調優:
# Broker端參數 num.io.threads=8 num.network.threads=3 log.dirs=/var/lib/kafka log.index.size.max.bytes=10485760 log.index.interval.bytes=4096 log.segment.bytes=536870912 num.partitions=16 message.max.bytes=1000000 replica.fetch.max.bytes=16485760 replica.fetch.wait.max.ms=500 # Producer端參數 acks=1 batch.size=32768 linger.ms=5 compression.type=gzip # Consumer端參數 fetch.min.bytes=16384 fetch.max.bytes=5242880 max.poll.records=1024
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/250507.html
微信掃一掃
支付寶掃一掃