深入浅出kafka③

86 阅读1分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

消费者

  • 在企业中一般接入kafka会先申请消费组,消费者本身是属于消费者群组,我们申请后的群组如”kafka_consumer_biz1“,订阅的是同一个主题

image.png

public class consumer extends Thread {
    // 基础配置 简单省略键值的序列化格式
    private Properties config() {
        Properties properties = new Properties();
        properties.put("servers","127.0.0.1:9092");
        properties.put("groupId","consumer_biz1");
        properties.put("enable.auto.commit","true");
        return properties;
    }
    @Override
    public void run() {
        KafkaConsumer<String,String> consumer = new KafkaConsumer<>(config());
        consumer.subscribe(Arrays.asList("topic_test"));
        Boolean flg = true;
        while (flg) {
            ConsumerRecords<String,String> records = consumer.poll(50);
            Iterator<ConsumerRecord<String, String>> iterator = records.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next().value());
            }
        }
        consumer.close();
    }
}
  • 上述代码可以看到 while(true) 是一个一直请求kafka消息的循环
  • 在poll()方法中会有一个超时时间,如果超时时间设置特别大就会导致下消费者在没有获取到消息是 一直阻塞住
  • 目前我们已经实现了 可以多线程的去消费broker中的消息
  • 我们此次设置的是树洞提交偏移量

image.png

  • 值得注意的是 我们在使用线程池是 也可以记录哪条线程进行消费了数据,这样在业务中排查问题是一个很便捷的
  • 消费者在受用偏移量是 可以追踪到每次的读到消息的位置
  • 在消费者挂掉或者由于程序挂掉 broker就会自动rebalance触发再平衡
  • 我们可以异常捕获到以后 将偏移量存储到redis中,再次手动提交,保证数据不丢失问题

image.png

  • 在kafka中也提到过做一个偏移量的监听器
    • 其操作是在订阅时传入ConsumerRebalanceListener实例