试用期之kafka初步

kafka简单复习

  • 消息
  • 生产者(producer):将消息放入对应主题的分区(partition)中
    • 键:一个标记(标记消息)
    • 分区器:算法(将消息放入哪个分区)
  • 消费者(consumer):订阅主题(Topic),根据偏移量(第几个消息)获取消息,每一个消费者都属于某一个消费者组(consumer group),同一个消费者组的消费者只能有一个消费者消费某个分区的消息,不同消费者组中的消费者可以消费同一个分区消息。
  • kafka服务器:broker,一个broker有多个主题,一个主题有多个分区
  • 多个broker组成kafka集群:需要一个broker来充当控制器,其他broker相互备份,一个宕机另一个马上可以用(高可用)
  • 每个主题创建副本的数量不能多于broker的数量

springboot整合kafka

  • 依赖引入、配置文件
  • 生产者编写
public class Producer{
    String serverList="";
    String topic = "";
    String groupId = "";
    Properties properties = new Properties();
    //配置key序列化
    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
    //配置value序列化
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
    //kafka地址配置
    properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,serverList);
    
    //配置注册
    KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
    for(int i = 0; i < 5; i++){
        kafkaProducer.send(new ProducerRecord<>(topic,"demo" + i)).get();
    }
}
  • 消费者编写
public class Consumer{
    String serverList="";
    String topic = "";
    String groupId = "";
    Properties properties = new Properties();
    //配置key反序列化
    properties.put(ProducerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    //配置value反序列化
    properties.put(ProducerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    //kafka地址配置
    properties.put();
    //配置消费者组
    properties.put("group.id", groupId);
    //配置注册
    KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
    // 订阅主题
    kafkaConsumer.subscribe(Collections.singletonList(topic));
    while(true){
        // 1秒拉取一次消息
        ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(1000));
        if(Objects.isNull(records)){
            continue;
        }
        for(onsumerRecord<String, String> record: records){
            //消息处理
            bjectMapper objectMapper = new ObjectMapper();
            String jsonString = record.get(""); // 示例 JSON 格式的字符串
            MyObject myObject = objectMapper.readValue(jsonString, MyObject.class); // 将 JSON 格式的字符串转化为对象
            // ...
        }
    }
}
  • 监听器
public class ProducerSendListener implment ProducerListener{
    public void onSuccess(){
        producerRecord.key();
    }
    public void onError(){
        producerRecord.key();
    }
}
public class KafkaTest{
    @Autoware
    private KafkaTemplate<String,String> kafkaTemplate;
    @Autoware
    private ProductSendListener productSendListener; //监听器
    String topic = "topic"
    void sendMsg(){
        kafkaTemplate.setProducerListener(productSendListener);
        kafkaTemplate.send(topic,"Hello");
    }
}

发送消息的三种方式

发送即忘

  • 默认的send()方法就是发送即忘:发送消息后不会关注消息是否发送成功,不对结果负责,异步发送。
  • 场景:数据丢失对业务影响不大,如日志数据,并且要保持高吞吐量。

同步发送

  • 借助send()方法返回的future对象,调用get()方法同步阻塞,并配合acks参数的配置默认使用1、还有0all
    • 0:发送后成功,无需等待确认leader写入成功(与异步不同的是:还是需要返回对象,只是再写入成功前就返回)
    • 1:生产者接受到分区leader写入成功,才解除阻塞状态
    • -1(all):确保分区中所有副本全部写入成功才返回成功状态
  • 场景:需要确保消息发送成功并成功写入的场景
// 配置acks参数
properties.put(ProducerConfig.ACKS_CONF,1);

KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
for(int i = 0; i < 5; i++){
    RecordMetadata metadata = kafkaProducer.send(new ProducerRecord<>(topic,"demo" + i)).get();
}

异步发送+回调

  • send()方法本身就是异步的,无法判断消息是否发送成功,出现异常的时候没办法捕获,所以就采用回调的方法实现,回调函数包括两个参数,这两个参数是互斥的。
    • exception为空则meta不为空,代表发送消息成功
    • exception不为空则meta肯定为空,代表消息发送失败,出现异常
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
for(int i = 0; i < 5; i++){
    kafkaProducer.send(new ProducerRecord<>(topic,"demo" + i), new Callback() {
        @Override
        public void onCompletion(RecordMetadata metadata, Exception exception) {
            if (exception != null) {
                System.err.println("发送消息失败:" + exception.getMessage());
            } else {
                System.out.println("消息发送成功,topic:" + metadata.topic() + ", partition:" + metadata.partition() + ", offset:" + metadata.offset());
            }
        }
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值