生产者api示例
一个正常的生产逻辑需要具备以下几个步骤
-
配置生产者参数及创建相应的生产者实例
-
构建待发送的消息
-
发送消息
-
关闭生产者实例
采用默认分区方式将消息散列的发送到各个分区当中
package com.doitedu;
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) throws InterruptedException {
/**
* 1.构建一个kafka的客户端
* 2.创建一些待发送的消息,构建成kafka所需要的格式
* 3.调用kafka的api去发送消息
* 4.关闭kafka生产实例
*/
//1.创建kafka的对象,配置一些kafka的配置文件
//它里面有一个泛型k,v
//要发送数据的key
//要发送的数据value
//他有一个隐含之意,就是kafka发送的消息,是一个key,value类型的数据,但是不是必须得,其实只需要发送value的值就可以了
Properties pros = new Properties();
//指定kafka集群的地址
pros.setProperty("bootstrap.servers", "linux01:9092,linux02:9092,linux03:9092");
//指定key的序列化方式
pros.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//指定value的序列化方式
pros.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//ack模式,取值有0,1,-1(all),all是最慢但最安全的 服务器应答生产者成功的策略
pros.put("acks", "all");
//这是kafka发送数据失败的重试次数,这个可能会造成发送数据的乱序问题
pros.setProperty("retries", "3");
//数据发送批次的大小 单位是字节
pros.setProperty("batch.size", "10000");
//一次数据发送请求所能发送的最大数据量
pros.setProperty("max.request.size", "102400");
//消息在缓冲区保留的时间,超过设置的值就会被提交到服务端
pros.put("linger.ms", 10000);
//整个Producer用到总内存的大小,如果缓冲区满了会提交数据到服务端
//buffer.memory要大于batch.size,否则会报申请内存不足的错误
pros.put("buffer.memory", 10240);
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(pros);
for (int i = 0; i < 1000; i++) {
//key value 0 --> doit32+-->+0
//key value 1 --> doit32+-->+1
//key value 2 --> doit32+-->+2
//2.创建一些待发送的消息,构建成kafka所需要的格式
ProducerRecord<String, String> record = new ProducerRecord<>("test01", i + "", "doit32-->" + i);
//3.调用kafka的api去发送消息
kafkaProducer.send(record);
Thread.sleep(100);
}
kafkaProducer.flush();
kafkaProducer.close();
}
}
对于properties配置的第二种写法,相对来说不会出错,简单举例:
public static void main(String[] args) {
Properties pros = new Properties();
pros.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "linux01:9092,linux02:9092,linux03:9092");
pros.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
pros.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
}
1.kafka的生产者可以持续不断的向topic中发送数据不?
可以
2.kafak的生产者有哪些必须配置的参数:
//指定kafka集群的地址 pros.setProperty("bootstrap.servers", "linux01:9092,linux02:9092,linux03:9092"); //指定key的序列化方式 pros.setProperty("key.serializer","org.apache.kafka.common.serialization.StringSerializer"); //指定value的序列化方式 pros.setProperty("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
3.kafka生产者发送数据的时候,可以用jdk的序列化器来将数据进行序列化不?
不可以,kafka有指定的序列化接口 org.apache.kafka.common.serialization.Serializer
4.构造一个kafka的生产者后,是不是就已经确定了,我的数据是需要发送到哪一个topic里面不?
不是哦,咱们构造生产者对象的时候不需要指定topic,是在构造发送数据对象的时候才指定的
消费者Api示例
一个正常的消费逻辑需要具备以下几个步骤:
-
配置消费者客户端参数及创建相应的消费者实例;
-
订阅主题topic;
-
拉取消息并消费;
-
定期向__consumer_offsets主题提交消费位移offset;
-
关闭消费者实例
package com.doitedu;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.header.Header;
import org.apache.kafka.common.header.Headers;
import org.apache.kafka.common.record.TimestampType;
import org.apache.kafka.common.serialization.StringDeserializer;
import java.time.Duration;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Optional;
import java.util.Properties;
public class ConsumerDemo {
public static void main(String[] args) {
//1.创建kafka的消费者对象,附带着把配置文件搞定
Properties props = new Properties();
//props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"linux01:9092,linux02:9092,linux03:9092");
//props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
//props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
// 定义kakfa 服务的地址,不需要将所有broker指定上
// props.put("bootstrap.servers", "linux01:9092,linux02:9092,linux03:9092");
// 制定consumer group
props.put("group.id", "g3");
// 是否自动提交offset __consumer_offset 有多少分区 50
props.put("enable.auto.commit&#

本文详细介绍了Kafka的生产者和消费者API的使用,包括生产者发送消息的步骤、消费者订阅主题的方式、消息消费模式,以及自动和手动提交消费者偏移量的策略。重点讨论了subscribe与assign的区别,以及不同提交方式下的消息丢失和重复消费问题。
最低0.47元/天 解锁文章
705

被折叠的 条评论
为什么被折叠?



