Kafka-偏移量(含消费者事务)

Kafka概述

在这里插入图片描述

1.什么是偏移量:

  • 在 Kafka 中,每个分区的消息都会被分配一个唯一的偏移量(offset)。偏移量简单来说就是消息在分区中的位置标识。

  • 偏移量从 0 开始递增,每条消息的偏移量都会比前一条消息的偏移量大 1。

  • 消费者通过跟踪每个分区的偏移量来记录自己消费的进度,以便在重新启动或重试时能够准确地从上次停止的位置继续消费消息。

2.偏移量的作用:

(1)记录消费位置:

  • 消费者通过提交偏移量来告知 Kafka 自己已经成功消费了一批消息,Kafka 将会记录这个偏移量,以便在消费者重新加入时能够准确地从上次停止的位置继续消费。

(2)确保消息传递:

  • Kafka 使用偏移量来确保消息被传递一次且仅一次。
  • 消费者可以通过控制偏移量的提交来避免重复消费消息。

(3)容错和恢复:

  • 偏移量的存在使得消费者在发生故障或重启后能够准确地从中断的位置继续消费消息,而不会造成数据丢失或重复消费。

3.offset的默认维护位置

在这里插入图片描述

  • __consumer_offsets主题里面采用key和value的方式存储数据。
  • key是group.id+topic+分区号,value就是当前offset的值。
  • 每隔一段时间,kafka内部会对这个topic进行compact,也就是每个group.id+topic+分区号就保留最新数据。

4.偏移量的管理:

(1)自动提交:

  • 消费者可以选择开启自动提交偏移量的功能,让 Kafka 在后台自动管理偏移量的提交。
  • 这种方式简化了偏移量的管理,但可能会导致一些问题,如消息重复消费。
    在这里插入图片描述
    在这里插入图片描述

(2)手动提交:

  • 消费者也可以选择手动提交偏移量,以更精确地控制偏移量的提交时机。
  • 手动提交偏移量可以在处理每条消息后立即提交,也可以在一批消息处理完成后批量提交。
    在这里插入图片描述

5.指定Offset消费

在这里插入图片描述

5.漏消费和重复消费

  • 重复消费:已经消费了数据,但是offset没提交。
    在这里插入图片描述

  • 漏消费:先提交offset后消费,有可能会造成数据的漏消费。
    在这里插入图片描述

怎么能做到既不漏消费也不重复消费呢?详看消费者事务。

6.消费者事务

在这里插入图片描述

7.数据积压

在这里插入图片描述
在这里插入图片描述

偏移量在 Kafka 中起着非常重要的作用,它不仅记录了消费者消费消息的位置,还确保了消息的传递和消费者的容错恢复能力。消费者需要适时地提交偏移量,以确保消费进度能够正确记录并在需要时能够准确地恢复。


Tips:想了解更多相关知识,可以移步我的主页哦~

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要获取Kafka偏移,可以使用Kafka Consumer API提供的方法。以下是获取Kafka偏移的示例代码: ```java import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.TopicPartition; import java.util.Arrays; import java.util.Properties; public class KafkaOffsetExample { private static final String TOPIC_NAME = "my-topic"; private static final String BOOTSTRAP_SERVERS = "localhost:9092"; private static final String GROUP_ID = "my-group"; public static void main(String[] args) { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); props.put(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); // 订阅主题 consumer.subscribe(Arrays.asList(TOPIC_NAME)); // 获取分区 TopicPartition partition = new TopicPartition(TOPIC_NAME, 0); // 获取偏移 long offset = consumer.position(partition); System.out.println("Offset: " + offset); // 关闭消费者 consumer.close(); } } ``` 在这个例子中,我们使用KafkaConsumer类获取Kafka偏移。首先,我们创建KafkaConsumer实例并订阅主题。然后,我们获取分区并使用position()方法获取当前偏移。最后,我们打印偏移并关闭消费者

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喻师傅

谢谢您!我会继续努力创作!

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

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

打赏作者

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

抵扣说明:

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

余额充值