生产者

屏幕截图 2020-08-20 150154

发送消息:

Properties props = new Properties();//kafka 集群,broker-listprops.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 的实现