Kafka消费者-笔记2

Kafka消费者-笔记2

消费者,消费组

一个消费组只有一个消费者能消费消息

消费者Consumer负责订阅kafka中的主题Topic,并且从订阅的主题上拉取消息。
每个消费者有一个对应的消费组Consumer Group,当消息发布到主题后,只会被订阅它的每个消费组中的一个消费者

可通过消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略

kafka支持两种消息投递模式:点对点P2P(所有消费者属于一个消费组),发布/订阅Pub/Sub模式(所有消费者属于不同的消费组)

消费者客户端参数group.id配置消费组

消费者客户端

正常的消费逻辑:

  • 配置消费者客户端参数并创建消费者实例
  • 订阅主题
  • 拉取消息消费
  • 提交消费位移
  • 关闭消费者实例

demo

    public static final String brokerList = "localhost:9092";
    public static final String topic = "topic-demo";
    public static final String groupId = "group.demo";
    public static final AtomicBoolean isRunning = new AtomicBoolean(true);

    public static Properties initConfig() {
        Properties props = new Properties();
        props.put("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("bootstrap.servers", brokerList);
        props.put("group.id", groupId);
        props.put("client.id", "consumer.client.id.demo");
        return props;
    }

    public static void main(String[] args) {
        Properties props = initConfig();
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Arrays.asList(topic));
        try {
            while (isRunning.get()) {
                ConsumerRecords<String, String> records =
                        consumer.poll(Duration.ofMinutes(2));

                // 客户端拉取消息并消费所有消息
                for (ConsumerRecord<String, String> record : records) {
                    System.out.println("topic = " + record.topic()
                            + ", partition = " + record.partition()
                            + ", offset = " + record.offset());
                    System.out.println("key = " + record.key()
                            + ", value = " + record.value());
                    //do something to process record.
                    System.out.println(record.headers());
                }
                
            }
        } catch (Exception e) {
            log.error("occur exception ", e);
        } finally {
            consumer.close();
        }
    }

需要初始化配置于KafkaConsumer(subscribe方法订阅主题)(poll方法拉取消息列表)

参数配置

必要参数:

bootstrap.servers:连接kafka集群地址
group.id:消费者所属消费组的id
key.deserializer和value.deserializer:与生产者客户端相对应的反序列器
client.id:设定KafkaConsumer对应的客户端id,不设置 自动生成形如consumer-1
更多参数查看类ConsumerConfig

订阅主题和分区

消费者可以订阅一个或多个主题,使用subscribe方法订阅主题,订阅方式有数组和正则

主题

subscribe订阅主题:

// 集合方式订阅主题
public void subscribe(Collection<String> topics, ConsumerRebalanceListener listener)
public void subscribe(Collection<String> topics)
// 正则方式订阅主题
public void subscribe(Pattern pattern, ConsumerRebalanceListener listener)
public void subscribe(Pattern pattern)

注意:subscribe执行多次以最后一次执行结果为准
ConsumerRebalanceListener用来设置相应的再均衡监听器

正则subscribe订阅主题实例:

订阅形如topic-1这样的主题 贪婪匹配
consumer.subscribe(Pattern.compile(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值