【Kafka】【十七】消费者poll消息的细节与消费者心跳配置

消费者poll消息的细节与消费者心跳配置

长轮询poll消息

默认情况下,消费者⼀次会poll500条消息。

//⼀次poll最⼤拉取消息的条数,可以根据消费速度的快慢来设置
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 500);

代码中设置了⻓轮询的时间是1000毫秒

while (true) {
	/*
	 * 3.poll() API 是拉取消息的⻓轮询
	 */
	ConsumerRecords< String, String > records = consumer.poll(Duration.ofMillis(10000));
	for (ConsumerRecord< String, String > record: records) {
	    //4.打印消息
	    System.out.printf("收到消息:partition = %d,offset = %d, key = %s, value = %s%n ", record.partition(),
	            record.offset(), record.key(), record.value());
	}
	
	//所有的消息已消费完
	if (records.count() > 0) {//有消息
	    // ⼿动同步提交offset,当前线程会阻塞直到offset提交成功
	    // ⼀般使⽤同步提交,因为提交之后⼀般也没有什么逻辑代码了
	    consumer.commitSync();//=======阻塞=== 提交成功
	}
}

意味着:

    • 如果⼀次poll到500条,就直接执⾏for循环
    • 如果这⼀次没有poll到500条。且时间在1秒内,那么⻓轮询继续poll,要么到500条,要么到1s
    • 如果多次poll都没达到500条,且1秒时间到了,那么直接执⾏for循环
  • 如果两次poll的间隔超过30s,集群会认为该消费者的消费能⼒过弱,该消费者被踢出消费组,触发rebalance机制,rebalance机制会造成性能开销。可以通过设置这个参数,让⼀次poll的消息条数少⼀点
//⼀次poll最⼤拉取消息的条数,可以根据消费速度的快慢来设置
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 100);

//如果两次poll的时间如果超出了30s的时间间隔,kafka会认为其消费能⼒过弱,将其踢出消费组。将分区分配给其他消费者。-rebalance
props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 30 * 1000);

消费者心跳检测配置

//consumer给broker发送⼼跳的间隔时间
props.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 1000);

//kafka如果超过10秒没有收到消费者的⼼跳,则会把消费者踢出消费组,进⾏ rebalance,
//把分区分配给其他消费者。
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 10 * 1000);
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kafka消费者的`poll`方法是用来从Kafka集群中拉取消息的主要方法。当消费者调用`poll`时,它会向Kafka集群发送拉取请求,并等待一段时间以接收新的消息。 `poll`方法有一个可选的参数,用于指定等待时间,即在没有新消息拉取时,消费者将等待的最长时间。如果没有指定等待时间或指定为0,`poll`方法将立即返回,不论是否有新消息可用。 当`poll`方法返回时,它将返回一个记录集合,即消费者Kafka拉取到的消息消费者可以遍历这个记录集合,逐处理每消息。 示例代码如下: ```java Properties props = new Properties();props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "my-consumer-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("my-topic")); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("Received message: key = %s, value = %s%n", record.key(), record.value()); } } ``` 在上述示例中,我们创建了一个Kafka消费者,并订阅了一个名为"my-topic"的主题。然后在一个无限循环中,我们不断调用`poll`方法以拉取新的消息,并对每消息进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BirdMan98

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值