Kafka Queue: 完成 alterShareGroupOffsets Api

Share group支持重置偏移量

支持重置偏移量,换句话说也就是支持消息的重放;classic group支持按照偏移量或者时间重置到最新、最老以及指定时间的偏移量

PR list

命令

kafka-share-groups.sh --bootstrap-server localhost:9092 --group S1 --topic T1 --reset-offsets --to-earliest --execute

SPSO

Share group引入了SPSO(Share-partition start offset) 的概念,可以理解为当前第一个被客户端拉走,但是未被提交的record batches,这个功能主要就是对SPSO进行操作

新增请求与响应

请求体

json 复制代码
{
  "apiKey": 91,
  "type": "request",
  "listeners": ["broker"],
  "name": "AlterShareGroupOffsetsRequest",
  "validVersions": "0",
  "flexibleVersions": "0+",
  "fields": [
    { "name": "GroupId", "type": "string", "versions": "0+", "entityType": "groupId",
      "about": "The group identifier." },
    { "name": "Topics", "type": "[]AlterShareGroupOffsetsRequestTopic", "versions": "0+",
      "about": "The topics to alter offsets for.",  "fields": [
        { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "mapKey": true,
          "about": "The topic name." },
        { "name": "Partitions", "type": "[]AlterShareGroupOffsetsRequestPartition", "versions": "0+",
          "about": "Each partition to alter offsets for.", "fields": [
            { "name": "PartitionIndex", "type": "int32", "versions": "0+",
              "about": "The partition index." },
            { "name": "StartOffset", "type": "int64", "versions": "0+",
              "about": "The share-partition start offset." }
          ]}
      ]}
  ]
}

响应体

json 复制代码
{
  "apiKey": 91,
  "type": "response",
  "name": "AlterShareGroupOffsetsResponse",
  "validVersions": "0",
  "flexibleVersions": "0+",
  // Supported errors:
  // - GROUP_AUTHORIZATION_FAILED (version 0+)
  // - TOPIC_AUTHORIZATION_FAILED (version 0+)
  // - NOT_COORDINATOR (version 0+)
  // - COORDINATOR_NOT_AVAILABLE (version 0+)
  // - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
  // - GROUP_ID_NOT_FOUND (version 0+)
  // - NON_EMPTY_GROUP (version 0+)
  // - KAFKA_STORAGE_ERROR (version 0+)
  // - INVALID_REQUEST (version 0+)
  // - UNKNOWN_SERVER_ERROR (version 0+)
  "fields": [
    { "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
      "about": "The duration in milliseconds for which the request was throttled due to a quota violation, or zero if the request did not violate any quota." },
    { "name": "ErrorCode", "type": "int16", "versions": "0+",
      "about": "The top-level error code, or 0 if there was no error." },
    { "name": "ErrorMessage", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null",
      "about": "The top-level error message, or null if there was no error." },
    { "name": "Responses", "type": "[]AlterShareGroupOffsetsResponseTopic", "versions": "0+",
      "about": "The results for each topic.", "fields": [
        { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "mapKey": true,
          "about": "The topic name." },
        { "name": "TopicId", "type": "uuid", "versions": "0+",
          "about": "The unique topic ID." },
        { "name": "Partitions", "type": "[]AlterShareGroupOffsetsResponsePartition", "versions": "0+", "fields": [
          { "name": "PartitionIndex", "type": "int32", "versions": "0+",
            "about": "The partition index." },
          { "name": "ErrorCode", "type": "int16", "versions": "0+",
            "about": "The error code, or 0 if there was no error." },
          { "name": "ErrorMessage", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null",
            "about": "The error message, or null if there was no error." }
        ]}
      ]}
  ]
}

主要过程

  1. 只有空的消费组支持重置
  2. 重置过程中,会触发一次Group Coordinator初始化ShareGroupState的过程
  3. Group Coordinator向Share Coordinator持久化一条InitialzeShareGroupState的请求,持久化写入__share_group_state内部Topic

过程中遇到的问题

1、代码习惯、缩进以及语言风格的问题;

2、参数校验以及异常处理,各种情况下的参数抛出,比如下面这些场景

3、因为写API的过程中参考了ConsumerGroup的实现,没有注意到错误码的处理过程,实际上对于经典消费组重置偏移量的过程,是通过提交一个新的CommitOffset 请求来实现的,并没有所为顶层错误码的概念; 但是后在AlterShareGroupOffsetsResponse的响应体存在顶层的异常ErrorCode与ErrorMessage,但是实做过程中没有处理并封装到各个分区的响应中。后来AJ写了一个follow-up完成了这块:https://github.com/apache/kafka/pull/20049/files

相关推荐
编程彩机4 小时前
互联网大厂Java面试:从分布式事务到微服务优化的技术场景解读
java·spring boot·redis·微服务·面试·kafka·分布式事务
indexsunny5 小时前
互联网大厂Java面试实战:从Spring Boot到Kafka的技术与业务场景解析
java·spring boot·redis·面试·kafka·技术栈·microservices
鱼跃鹰飞6 小时前
大厂面试真题-说说Kafka消息的不重复和不丢失
java·分布式·kafka
冷崖6 小时前
消息队列-kafka的安装(二)
分布式·kafka
冷崖6 小时前
消息队列-kafka的操作(三)
分布式·kafka
冷崖1 天前
消息队列-kafka(一)
分布式·kafka
不光头强1 天前
kafka学习要点
分布式·学习·kafka
编程彩机1 天前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
indexsunny1 天前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
AC赳赳老秦2 天前
专利附图说明:DeepSeek生成的专业技术描述与权利要求书细化
大数据·人工智能·kafka·区块链·数据库开发·数据库架构·deepseek