Kafka篇——Kafka消费者端常见配置,涵盖自动手动提交offset、poll消息细节、健康状态检查、新消费组消费offset规则以及指定分区等技术点配置,全面无死角,一篇文章拿下!

消费者端自动和手动提交offset

一、自动提交offset
1、概念
Kafka中默认是自动提交offset。消费者在poll到消息后默认情况下,会自动向Broker的_consumer_offsets主题提交当前
主题-分区消费的偏移量

2、自动提交offset和手动提交offset流程图

3、在Java中实现配置


4、自动提交offset问题
自动提交会丢消息。因为如果消费者还没有消费完poll下来的消息就自动提交了偏移量,那么此时消费者挂了,
于是下一个消费者会从已经提交的offset的下一个位置开始消费消息。之前未被消费的消息就丢失掉了。

二、手动提交offset
1、在Java中配置手动提交

2、手动提交两种方式
1)手动同步提交
同步提交的时候,会阻塞等待,等待Kafka集群确认收到这个offset,并返回给消费者一个ACK后,才会继续执行下面的业务代码

2)手动异步提交
在消息消费完后,不需要等待集群返回ACK,直接执行之后的逻辑,可以设置回调方法,供Kafka的Broker集群调用

消费者poll消息细节

消费者poll消息。就是消费者与Broker建立长连接拉取数据

一、在Java中,默认的配置是一次性poll500条数据

二、一次性poll的消息可以根据消费速度的快慢设置,因为如果两次poll的事件超出了30秒的时间间隔,Kafka会认为其消费能力过弱,将其提出消费组。将分区分配给其他消费者
注意:rebalance机制,也就是重新分配的工作是比较消耗性能的,一般尽量避免出现rebalance的情况。一般都会避免出现重新分配的情况,因为重新分配也是比较消耗性能的,所以如果一开始我们发现这个消费者的消费能力比较弱,那么就降低一次拉取消息的数量

如果每隔1s内没有poll到任何的消息,则会继续的poll,循环往复,直到poll到消息。如果时间超出了1s,则此次长轮询结束
代码中设置长轮询为1000毫秒:

意味着:
1、如果一次poll到了500条,直接执行下面的for循环
2、如果这一次没有poll到500条消息,且在1秒内,那么长轮询继续poll,要么到500条,要么时间到1秒
3、如果多次poll都没有达到500条,且1秒时间到了,那么直接执行for循环

三、消费者发送心跳的时间间隔

四、Kafka如果超过10s没有收到消费者的心跳,则会把消费者踢出消费组,进行rebalance,把分区分配给其他的消费者
注意:rebalance机制,也就是重新分配的工作是比较消耗性能的,一般尽量避免出现rebalance的情况

消费者健康状态检查(心跳机制)

消费者每隔1s向kafka集群发送心跳,集群发现如果有超过10s没有续约心跳的消费者,将被踢出消费组,出发该消费组的rebalance机制,
将该分区交给消费组里的其他消费者进行消费

指定分区消费

下面的代码表示指定某个主题的0号分区进行消费
命令:

Java代码实现:

消息回溯消费

所谓消息回溯消费,指的是默认情况下会从某个分区的偏移量+1进行消费,但是我们也可以指定从某个主题下的某个分区的最开始进行消费
命令:

Java代码实现:

控制台:
发现从第0个偏移量的消息也被消费了!

指定offset消费

命令:

Java代码实现:

控制台:
发现从偏移量10的地方开始消费了!

从指定时间点消费

根据时间,去所有的partition中确定该时间对应的offset,然后去所有的partition分区中找到该offset偏移量之后的消息开始消费

Java代码实现:
下面的案例是从当前时间的前1小时开始消费消息

新消费组消费offset规则

当新创建一个消费组去消费分区中的消息的时候,会有两种模式,分别是latest和earliest模式,下面是对两种模式的介绍
latest(默认):只消费自己启动后生产者发送到主题上的消息
earliest:第一次会从头开始消费,以后按照消费offset记录继续消费,这个需要区别于consumer.seekToBegining(每次都从头开始)

1、新消费组流程图

2、Java中配置新消费组消费方式

3、整体代码回顾

至此,关于Kafka中消费者相关的配置介绍完毕,内容较多,知识点比较分散,希望大家能够坚持反复学习。

后续还会持续更新,敬请期待~~~

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕盼支持

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

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

打赏作者

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

抵扣说明:

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

余额充值