生产者

屏幕截图 2020-08-20 150154

发送消息:

Properties props = new Properties();
//kafka 集群,broker-list
props.put("bootstrap.servers", "172.24.211.140:9092");
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 < 10; i++) {
    var record =
            new ProducerRecord<>("test", "Precision Products",
                    "France");
    producer.send(record, new Callback() {
        @Override
        public void onCompletion(RecordMetadata metadata, Exception exception) {
            System.out.println(metadata);
        }
    });

}
producer.close();

配置

顺序保证

屏幕截图 2020-08-24 085111

保证顺序的方法就是:

  1. 每个主题只分为一个区
  2. 每次发送的消息发送到同一个分区

序列化器

分区策略

分区的原因:

分区原则:

自定义分区器:

实现Partitioner接口

数据可靠性保证

将服务器的 ACK 级别设置为-1,可以保证 Producer 到 Server 之间不会丢失数据,即 AtLeast Once 语义

At Least Once + 幂等性 = Exactly Once

另外一个需要注意的是要注册发送回调,发生不成功,需要客户端进行重试

生产者幂等

生产者可以指定 enable.idempotence 来实现生产幂等,其原理是 broker 引入了ProducerID和SequenceNumber,每个新的Producer初始化时,会被分配一个唯一的ProducerID,同时生产者为每条消息生成SequenceNumber,broker 端通过这两个字段来判断数据之前是否发送过,从而实现幂等

这种幂等判断只能保证某个主题的一个分区上不出现重复消息

事务

能保证多条消息原子性地写入到目标分区,同时也能保证 Consumer 只能看到事务成功提交的消息

producer.beginTransaction(); 
producer.send(record1); 
producer.send(record2); 
producer.commitTransaction();

是一种类似 2PC 的实现