目录
💟这里是CS大白话专场,让枯燥的学习变得有趣!
💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
💟好记性不如烂键盘,自己总结不如收藏别人!
💌Kafka是一个分布式的基于发布/订阅模式的消息队列。
🧡生产者原理
💌在生产者向Broker发送消息的过程中,涉及到两个线程:main线程和sender线程,以及一个线程共享变量:RecordAccumulator。
🍠main线程:将消息发送给RecordAccumulator,一个分区会创建一个队列,在内存里完成。
🍠sender线程:不断从RecordAccumulator中拉取消息发送到Kafka Broker,涉及以下两个参数:
batch.size:只有数据积累到batch.size之后,sender才会发送数据。
linger.ms:如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据。
🧡异步发送
💌允许生产者把信息放入消息队列中,但不立即处理。
🍠添加依赖。
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
🍠编写Java代码。
package com.jodie.kafka.producer;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
/**
* @author Jodie
* @date 2022/9/20-8:45
*/
public class CustomProducer {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.10.102:9092,192.168.10.103:9092");
//properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
kafkaProducer.send(new ProducerRecord<>("first","jodie"));
kafkaProducer.close();
}
}
🍠Customer接收数据。
💌如果发送方没有报错但是消费者接收不到数据,可能是配置问题,进入kafka/config里编辑server.properties,把listeners放出来。
🧡回调异步发送
💌消息发送到队列后返回自定义信息,如发送到哪个主题、分区。
🍠在发送时添加Callback()完成回调。
kafkaProducer.send(new ProducerRecord<>("first", "jodie"), new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if(e == null){
System.out.println("主题:"+ recordMetadata.topic() + "分区:" + recordMetadata.partition());
}
}
});
🧡同步发送
💌等待消息完全处理完再发送下一个信息。
🍠在发送时添加.get()。
kafkaProducer.send(new ProducerRecord<>("first","jodie")).get();