kafka的消费者组(下)

上一文对消费者组的一些概念,基本原理进行了简单描述,本文继续来聊聊消费者组中另外一个比较重要的内容:偏移量的存储。

【消费者偏移量的提交】

1. 消息消费的整体流程介绍

消费者在成功加入消费者组,并得到分配的分区信息后,对分配的分区依次向服务端发送请求获取上一次提交的偏移信息,并在内存中记录获取到的偏移量信息;

随后向服务端发送fetch(消息)请求,在该请求中就包含了内存中记录的偏移量信息,即从指定位置进行消息的消费。

服务端根据请求信息从log文件中读取文件,并给予响应。

客户端收到消息后,在内存中更新消费的偏移量信息,并由使用者手动或自动向服务端提交消费的偏移量信息。

2. 偏移量的提交流程

消费者的偏移量是由消费者自己来进行提交的,当前提交的方式有两种,自动提交或手动提交。

1)自动提交

当配置项"enable.auto.commit"设置为true后,消费者开启自动提交偏移的模式。自动提交本质上是消费者内部的轮询线程定时、异步对内存中记录的偏移量信息进行提交。

定时的时间间隔是由配置项"auto.commit.interval.ms"的值来决定的。

2)手动提交

当配置项"enable.auto.commit"设置为false后,也就禁用了自动提交偏移量的功能。此时使用者在处理消费的消息的同时,需要调用"commitSync"来手动提交消费偏移量信息。当然,从函数的字面意思也可以看出,手动提交请求动作是同步完成的。

【偏移量在服务端的存储】

kafka服务端对于消费者偏移量提交请求的处理,最终是将其存储在名为"__consumer_offsets"的topic中(其处理流程本质上是复用了向该topic生成一条消息的流程)。该topic默认有50个分区,不同消费者组的偏移量信息存储在不同的分区中,具体按照如下公式计算出存储的分区号:

Math.abs(groupId.hashCode) % groupMetadataTopicPartitionCount
// groupId.hashCode 为消费者组名称的哈希值
// groupMetadataTopicPartitionCount 为__consumer_offsets的分区数

也就是说,一条偏移量提交的请求,以一个消息记录的形式在topic中存储。该消息记录分为key,value两部分,在key中记录了偏移量对应的消费者组名称、消费的topic名称以及分区编号;而在value中则记录了具体的偏移位置,元数据,以及提交时间戳和过期时间戳。

01874371cc7f66c44ecaa4c81c882e02.jpeg

来看个实际实例:在名为hncscwc的topic的第3个分区上,有2条消息,名为spurs的消费者组在该topic上完成消费并提交了偏移量后的情况:

首先,可以通过命令,查看该消费者的偏移量情况:

sh kafka-consumer-groups.sh --bootstrap-server 192.168.42.198:9092 --describe --group spurs
Consumer group 'spurs' has no active members.

TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET  LAG CONSUMER-ID     HOST CLIENT-ID
hncscwc 3          2               2               0               - - -

其次,根据上面的计算公式,可以知道消费者组的偏移量存储分区为43。

scala> Math.abs("spurs".hashCode) % 50
res1: Int = 43

最后,直接查看"__consumer-offsets-43"下的log文件的内容

5c7ddf80b03cbb22d28d721677f0641a.jpeg

需要注意的是:kafka在运行过程中仅在内存中记录了消费者组的相关信息(包括当前成员信息、偏移量信息等)。那么当删除了__consumer_offset对应的消息记录或者消息超过存储的有效期被自动删除后,对应的消费者组信息也随之消失了。

【偏移量失效的处理策略】

1. 消费者偏移量 out of range的场景

根据前面的介绍可以知道,生产消费的消息与消费者偏移量是分别存储在两个topic中的,通常来说,消费者在加入消费者组后,会从服务端获取对应分区的消费偏移量,这个偏移量一定是在正常生产消息的偏移量范围之内的。然而,在一些特定场景下,也会出现消费者偏移量不在生产的消息的偏移量范围之内的情况。下面就分别举例说明下:

1)消费的偏移量小于实际消息的偏移量

当使用者对topic配置了消息预留期限,或者称之为生命周期(retention),随着时间的推移,消息被删除(也可能是手动删除了老的消息),就可能出现实际消费的偏移量,小于已存储最小消息的偏移量的情况。

72d4b183d2f05800d3e5f745f43c08eb.jpeg

2)消费的偏移量大于实际消息的偏移量

一种可能出现该情况的场景是:生产者往topic发送消息的同时,消费者也在进行消费,并且最新消息均消费后进行了offset的提交,服务端在对消费者偏移量的记录完成刷盘动作后,生产消费的topic分区leader节点出现掉电异常,导致实际消息并未写入磁盘,从而出现这种情况。该场景比较难出现,但我们在实际环境中确实遇到过。

c98b61cd2a27d4b3ca5c61e0d5dda293.jpeg

2. 消费者的处理策略

不管是上面那种情况,消费者在消费过程中,都会出现"out of range"的异常。在出现该异常后,由配置项"AUTO_OFFSET_RESET_CONFIG"来决定处理策略。该配置项可选的值包括:

  • none

即不做任何处理,kafka客户端直接将异常抛出,调用者可以捕获该异常来决定后续处理策略。

  • earliest

将消费者的偏移量重置为最早(有效)的消息的偏移位置,从头开始消费。这可能会引起消息的重复消费。

  • latest

将消费者的偏移量重置为最新的消息的偏移位置,从最新的位置开始消费。这可能会引起部分消息未进行消费出现消息"丢失"的情况。

关键的代码逻辑如下所示:

7e6cff5fea100caf594ed561cfd2f537.jpeg

另外,在flink的kafka-connector和spark streaming中,该配置项的默认值不同,使用时需要注意。

【小结】

本文主要介绍了kafka消费者组中消费者偏移量的相关内容,并通过一些实际例子对原理分析进行论证,感兴趣的小伙伴们也可以对其中的内容自行测试分析。

好了,这就是本文的全部内容,如果觉得本文对您有帮助,请点赞+转发,如果觉得有不正确的地方,也可以拍砖指点,最后,欢迎加我微信交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下命令来查看Kafka消费下的消费者: ``` bin/kafka-consumer-groups.sh --bootstrap-server <kafka-broker-url> --describe --group <consumer-group-name> ``` 其中,`<kafka-broker-url>`是Kafka集群的地址,`<consumer-group-name>`是要查看的消费的名称。 执行上述命令后,会列出该消费下的所有消费者的详细信息,包括消费者ID、消费者主机、消费者状态等。 ### 回答2: 想要查看 Kafka 中某个消费下的消费者,可以通过 Kafka 提供的命令行工具来实现。 使用命令`kafka-consumer-groups`可以列出所有的消费及其对应的消费者信息。具体操作如下: 1. 打开终端(Windows下为命令提示符或PowerShell,Linux下为终端窗口)。 2. 进入 Kafka 的安装目录(如果已经配置了环境变量,可以直接输入命令,否则需要输入完整的路径)。 3. 输入以下命令查看消费下的消费者: ``` kafka-consumer-groups --bootstrap-server localhost:9092 --list ``` 在上述命令中,`--bootstrap-server`参数指定了 Kafka 服务器的地址和端口,本例中为`localhost:9092`,可以根据实际情况进行修改。 执行命令后,终端会显示出 Kafka 中所有的消费名称。 要详细查看某个特定消费下的消费者信息,可以使用以下命令: ``` kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group <group_name> ``` 其中,`--describe`参数表示要查看消费者信息,`<group_name>`为指定的消费名称。 执行以上命令后,终端将会显示出指定消费下的各个消费者的详细信息,包括 Consumer ID、Host、Client ID 等。 通过以上命令,可以方便地查看 Kafka 中某个消费下的消费者情况。 ### 回答3: Kafka 是一个分布式流媒体平台,用于构建实时数据管道和流式处理应用程序。在 Kafka 中,消费者是一共享相同消费主题的消费者,它们协同工作以消费消息并处理数据。 要查看 Kafka 中特定消费下的消费者,可以使用命令行工具 `kafka-consumer-groups.sh`。以下是一个简单的步骤: 1. 打开终端并进入 Kafka 安装目录。 2. 运行以下命令: ```bash ./bin/kafka-consumer-groups.sh --bootstrap-server <kafka服务器地址> --list ``` 替换 `<kafka服务器地址>` 为实际的 Kafka 服务器地址。该命令将显示所有消费的列表。 3. 要查看特定消费下的消费者列表,请运行以下命令: ```bash ./bin/kafka-consumer-groups.sh --bootstrap-server <kafka服务器地址> --group <消费名称> --describe ``` 替换 `<kafka服务器地址>` 为实际的 Kafka 服务器地址,`<消费名称>` 为要查看的消费的名称。执行该命令后,将输出该消费下每个消费者的详细信息,包括消费者ID、主题、分区位置等。 通过使用 `kafka-consumer-groups.sh` 命令行工具,我们可以方便地查看 Kafka 中消费下的消费者。这对于了解消费者的状态,监控消费的健康情况和调试问题都非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值