这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
Kafka生产者
kafka的所有消息是遵循一定结构的,对应着Java的类就是ProducerRecord这个类:
public class ProducerRecord<K, V> {
// 指定发送到的主题
private final String topic;
// 指定发送到的分区
private final Integer partition;
// 可以设置一些和应用相关的信息,可以不设置
private final Headers headers;
// key可以让消息二次归类,相同key的消息会被发送到同一个分区
private final K key;
// 消息体
private final V value;
private final Long timestamp;
}
其中:timestamp是消息的时间,后面还有另外一个时间:LogAppendTime(消息追加到日志文件的时间)
producer必要信息
我们发送消息需要一个producer对象来进行发送,而创建一个producer需要一些必要的信息:
- bootstrap.servers
- broker 可以传一个或者多个,传一个也会通过那个去找到其他个,但是防止只传一个的那个挂掉,传多个保险下。
- key.serializer 和 value. serializer
- 传输到broker需要传输的是字节数组。byte[]。所以需要序列化。
我们在创建Producer对象的时候,这些配置都可以在ProducerConfig类中找到。通过配置一系列的参数,我们最终new出一个KafkaProducer生产者对象,并且该对象是线程安全。
创建ProducerRecord:topic和value是必填。
消息模式
发送消息主要有三种模式 :
- 发后即忘:性能最高,可靠性差
- 同步发送(sync)
- 异步发送(async)
生产者重要参数:
acks:分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消 息是成功写入的。acks 有三个值:
-
acks = 1:leader副本,写入成功,即返回给生产者(默认值)(可靠性和吞吐量的折中)
-
acks = 0:不需要任何服务器响应,(最大吞吐,低可靠)
-
acks = -1: 生产者发送消息后,只有所有的ISR副本都写入了消息,才返回成功响应。(最大可靠性)
消息异常
消息发送分为可重试的异常和不可重试的异常。
- 网络问题这些异常为可重复异常,RecordTooLargeException这些为非可重试异常(消息体太大了)。
- 可重试异常:可以配置 properties.put(ProducerConfig.RETRIES_CONFIG, 10);
分区器
发送消息,ProducerRecord 如果没有填写partition字段的话, 那么消息会走分区器来发送。默认分区器 采用MurmurHash2算法。 如果key为空的话,会轮询的方式写入分区。也可以自定义分区器。
一般编码流程
- 创建KafkaProducer
- 创建消息ProducerRecord
- 发送消息