Kafka生产者

375 阅读2分钟

这是我参与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为空的话,会轮询的方式写入分区。也可以自定义分区器。

一般编码流程

  1. 创建KafkaProducer
  2. 创建消息ProducerRecord
  3. 发送消息