Hi Andrew, Thanks for your feedback, I have updated the KIP.
Best Regards, Jiunn-Yang > Andrew Schofield <[email protected]> 於 2026年4月3日 晚上8:50 寫道: > > Makes total sense. > > On 2026/04/03 12:25:57 Chia-Ping Tsai wrote: >>> AS7: I'll have one last try at persuasion here, but I expect I won't >> succeed. In KIP-1274, the default group protocol for KafkaConsumer is >> changing to "consumer". It is true that "classic" is still supported, but >> users will need to explicitly enable it by setting >> "group.protocol=classic". I think this means we could change the default >> for "auto.offset.reset" to "by_start_time" in AK 5.0. Whether we want to do >> it is a different matter. >> >> I also love this new policy, but changing the default right now is a bit >> too eager for this KIP. I would prefer to implement it in 4.4.0 as an >> opt-in feature and announce it to users first. If we see good adoption and >> positive feedback from the community, we can then open a new KIP to discuss >> changing the default in a future release. Let's take it one step at a time >> >> >> Andrew Schofield <[email protected]> 於 2026年4月3日週五 下午7:58寫道: >> >>> Hi Jiunn-Yang, >>> Thanks for your response. >>> >>> AS1-AS6: lgtm >>> >>> AS7: I'll have one last try at persuasion here, but I expect I won't >>> succeed. In KIP-1274, the default group protocol for KafkaConsumer is >>> changing to "consumer". It is true that "classic" is still supported, but >>> users will need to explicitly enable it by setting >>> "group.protocol=classic". I think this means we could change the default >>> for "auto.offset.reset" to "by_start_time" in AK 5.0. Whether we want to do >>> it is a different matter. >>> >>> AS8, AS9: lgtm >>> >>> AS10: I'm not a fan of the "Epoch-ms" wording, particularly in the Admin >>> API javadoc. I would just use "The creation time of the group." or similar. >>> >>> AS11: I suspect you need to change StreamsGroupHeartbeatResponse too. >>> Probably need a Kafka Streams expert to weigh in how >>> `auto.offset.reset=by_start_time` would work for the consumer in a streams >>> group. >>> >>> Thanks, >>> Andrew >>> >>> On 2026/04/03 01:18:02 黃竣陽 wrote: >>>> Hello all, >>>> >>>> AS4 >>>> >>>> I agree that bumping the version for request/response protocols provides >>> a >>>> meaningful benefit: it allows the consumer to distinguish between "the >>> broker >>>> does not support this feature" and "the broker supports it, but the >>> group has no >>>> creation time." This enables more actionable error messages. >>>> >>>> For __consumer_offsets records (ConsumerGroupMetadataValue and >>>> StreamsGroupMetadataValue), I will keep tagged fields. These records >>> have no version >>>> negotiation. They are written and read internally by the broker. Tagged >>> fields allow old brokers >>>> to safely ignore unknown tags during log replay, and avoid the need to >>> rewrite existing records >>>> on upgrade. >>>> >>>> Best Regards, >>>> Jiunn-Yang >>>> >>>>> Chia-Ping Tsai <[email protected]> 於 2026年4月3日 上午8:01 寫道: >>>>> >>>>> AS4 >>>>> >>>>> Bumping the version actually provides a significant benefit. It allows >>> the new consumer to offer more actionable error messages to users, because >>> it can clearly distinguish between "the broker is too old to support this >>> feature" and "the broker supports it, but the group has no creation time." >>>>> >>>>> Furthermore, by bumping the version, the auto-generated protocol code >>> can gracefully handle the serialization (e.g., ignoring the field if the >>> client/broker is communicating with an older version). >>>>> >>>>> On 2026/04/02 15:04:39 黃竣陽 wrote: >>>>>> Hi Andrew, >>>>>> >>>>>> Thanks for the thorough review. >>>>>> >>>>>> AS1: >>>>>> The updated KIP now explicitly addresses these scenarios: >>>>>> - Configuring auto.offset.reset=by_start_time with a classic consumer >>> group throws >>>>>> ConfigException at startup. >>>>>> - Classic groups upgraded to modern groups cannot use by_start_time >>> immediately, >>>>>> because the group creation timestamp was not recorded at the time the >>> group was originally >>>>>> created. The consumer throws `GroupCreationTimeNotAvailableException` >>> in this case. >>>>>> Users must delete and recreate the group to obtain a fresh creation >>> timestamp. >>>>>> >>>>>> AS2, AS3, AS5: Updated the KIP accordingly. >>>>>> >>>>>> AS4: >>>>>> >>>>>> Tagged fields fit well because GroupCreationTimeMs / CreationTimeMs >>> is optional, >>>>>> with a default value of -1 ("unknown") that has clear semantics, >>> especially for pre-existing >>>>>> groups. They are only serialized when non-default, so they add no >>> overhead. Older >>>>>> brokers simply ignore unknown tags when replaying __consumer_offsets, >>> requiring no >>>>>> record rewriting during upgrades. >>>>>> >>>>>> In contrast, a version bump would require expanding validVersions, >>> adding version checks >>>>>> across read/write paths, and provides no real benefit given the >>> field’s optional nature and >>>>>> well-defined default. This follows Kafka’s convention: use tagged >>> fields for optional additions >>>>>> with meaningful defaults, and version bumps for mandatory or semantic >>> changes. >>>>>> >>>>>> AS6: >>>>>> >>>>>> Thanks for the clarification. I’ve incorporated this into the KIP. >>>>>> >>>>>> AS7: >>>>>> >>>>>> I agree that by_start_time better matches user expectations for the >>> default offset reset policy. >>>>>> However, since it is not supported by classic consumer groups and >>> would raise a ConfigException >>>>>> at startup, changing the default is only safe after the classic >>> protocol is removed from KafkaConsumer. >>>>>> Per KIP-1274, classic protocol support will be deprecated in Kafka >>> 6.0. After that, the >>>>>> default can be changed from latest to by_start_time. >>>>>> >>>>>> AS8: >>>>>> >>>>>> InvalidOffsetException is an abstract class that requires subclasses >>> to implement partitions(), >>>>>> implying the error is tied to specific partitions with invalid >>> offsets. >>>>>> >>>>>> GroupCreationTimeNotAvailableException does not fit this model. The >>> root cause is a missing >>>>>> group-level timestamp, not an issue with any particular partition. >>> Implementing partitions() >>>>>> would require returning an empty or artificial set, which violates >>> the API’s semantics. >>>>>> >>>>>> Therefore, I believe extending KafkaException is the better choice. >>>>>> >>>>>> AS9: >>>>>> >>>>>> Renamed to GroupCreationTimeNotAvailableException throughout the KIP. >>> This better >>>>>> describes the state ("not available") rather than the cause. >>>>>> >>>>>> Happy to hear any further feedback or suggestions. >>>>>> >>>>>> Best Regards, >>>>>> Jiunn-Yang >>>>>> >>>>>> >>>>>>> Andrew Schofield <[email protected]> 於 2026年4月2日 晚上8:34 寫道: >>>>>>> >>>>>>> Hi Jiunn-Yang, >>>>>>> Thanks for this great KIP. Some comments. >>>>>>> >>>>>>> AS1: A limitation of this KIP is that it will not support classic >>> consumer groups. I think this is not a problem and it will be a motivator >>> for users to adopt modern consumer groups, but it will be necessary to test >>> attempting to use the new policy with classic consumer groups and make sure >>> that the ConsumerGroupDescription lacks the creation timestamp and so on. >>> There is also the question of classic groups which are upgraded to modern >>> consumer groups. >>>>>>> AS2: It seems to me that you should also support streams groups, >>> both in a StreamsGroupMetadataValue and StreamsGroupDescription. >>>>>>> AS3: What you are describing as metadata log changes are actually >>> records on the __consumer_offsets topic. >>>>>>> AS4: While I understand the need to use tagged fields in the >>> records, I do not see why you cannot bump the versions for >>> ConsumerGroupHeartbeat and ConsumerGroupDescribe in order to support the >>> new fields. >>>>>>> AS5: In the Admin API, we already have an optional timestamp in >>> TransactionDescription.transactionStartTimeMs which uses the type >>> OptionalLong. Any reason not to use the same in ConsumerGroupDescription? >>>>>>> AS6: I don't think share group support is needed. "latest" already >>> starts at offset 0 for newly added partitions for share groups. >>>>>>> AS7: Might you consider making "by_start_time" the default value for >>> the auto.offset.reset consumer config in the next major release? I know >>> that's a bold move, but I think what you're getting with the new option is >>> what people expected "latest" to behave like. >>>>>>> AS8: I wonder whether GroupCreationTimeUnknownException should >>> extend the abstract InvalidOffsetException. >>>>>>> AS9: To follow existing exception names, I think >>> UnknownGroupCreationTimeException, GroupCreationTimeNotAvailableException >>> (my favourite) or GroupCreationTimeNotFoundException would better match >>> what we already have. wdyt? >>>>>>> >>>>>>> Thanks, >>>>>>> Andrew >>>>>>> >>>>>>> On 2026/04/02 11:34:10 黃竣陽 wrote: >>>>>>>> Hi chia, >>>>>>>> >>>>>>>> chia_13: >>>>>>>> `ConsumerGroupDescription` now gains a new method >>> `groupCreationTimeMs()`: >>>>>>>> >>>>>>>> `groupCreationTimeMs()` (`Optional<Long>`): the epoch-ms when this >>> consumer group >>>>>>>> was first created on the broker. `Optional.empty()` if unknown. >>>>>>>> >>>>>>>> Please take a look at the updated KIP and let us know if you have >>> further questions. >>>>>>>> >>>>>>>> Best Regards, >>>>>>>> Jiunn-Yang >>>>>>>> >>>>>>>>> Chia-Ping Tsai <[email protected]> 於 2026年4月2日 上午9:58 寫道: >>>>>>>>> >>>>>>>>> hi Jiunn >>>>>>>>> >>>>>>>>> chia_13: should we update the public API: ConsumerGroupDescription >>> as well? >>>>>>>>> >>>>>>>>> Best, >>>>>>>>> Chia-Ping >>>>>>>>> >>>>>>>>> On 2026/04/01 11:59:46 黃竣陽 wrote: >>>>>>>>>> Hi chia, >>>>>>>>>> >>>>>>>>>> Thank you for the thoughtful feedback! >>>>>>>>>> >>>>>>>>>> chia_10: I have added a clarification in the Proposed Changes >>> section to address this. In this case, >>>>>>>>>> ListOffsetsRequest will resolve to the Log End Offset, but this >>> is not a fallback to `latest`. The distinction >>>>>>>>>> matters: `latest` is a direct seek to the Log End Offset, whereas >>> `by_start_time` always anchors to the >>>>>>>>>> group creation timestamp and lets the lookup result follow >>> naturally. The consumer will begin consuming >>>>>>>>>> any new records produced after this point normally. >>>>>>>>>> >>>>>>>>>> chia_11: I have introduced a new exception >>> `GroupCreationTimeUnknownException` to signal >>>>>>>>>> this specific condition. >>>>>>>>>> >>>>>>>>>> chia_12: I have updated the KIP to expose the group creation >>> timestamp via `AdminClient.describeConsumerGroups()` >>>>>>>>>> , accessible through >>> `ConsumerGroupDescription.groupCreationTimeMs()`. This is backed by a new >>>>>>>>>> `GroupCreationTimeMs` field in `ConsumerGroupDescribeResponse. >>>>>>>>>> >>>>>>>>>> Best Regards, >>>>>>>>>> Jiunn-Yang >>>>>>>>>> >>>>>>>>>>> Chia-Ping Tsai <[email protected]> 於 2026年4月1日 下午2:33 寫道: >>>>>>>>>>> >>>>>>>>>>> hi Jiunn >>>>>>>>>>> >>>>>>>>>>> thanks for updating KIP. I have a couple of questions. >>>>>>>>>>> >>>>>>>>>>> chia_10: What happen if the group creation time is strictly >>> greater than the timestamp of the latest record in the partition? Will the >>> consumer fall back to the "latest" offset behaviour in this case? It could >>> be good to elucidate that in the KIP >>>>>>>>>>> >>>>>>>>>>> chia_11: Could you specify which exact exception will be thrown >>> when the group creation time is unknown >>>>>>>>>>> >>>>>>>>>>> chia_12: Since the group creation time is now a critical >>> semantic anchor, should we also expose it via the `DescribeGroupsResponse`? >>>>>>>>>>> >>>>>>>>>>> Best, >>>>>>>>>>> Chia-Ping >>>>>>>>>>> >>>>>>>>>>> On 2026/03/05 11:14:31 黃竣陽 wrote: >>>>>>>>>>>> Hello everyone, >>>>>>>>>>>> >>>>>>>>>>>> I would like to start a discussion on KIP-1282: Prevent data >>> loss during partition expansion for dynamically added partitions >>>>>>>>>>>> <https://cwiki.apache.org/confluence/x/mIY8G> >>>>>>>>>>>> >>>>>>>>>>>> This proposal aims to introduce a new auto.offset.reset policy >>> by_start_time, anchoring the >>>>>>>>>>>> offset reset to the consumer's startup timestamp rather than >>> partition discovery time, to prevent >>>>>>>>>>>> silent data loss during partition expansion. >>>>>>>>>>>> >>>>>>>>>>>> Best regards, >>>>>>>>>>>> Jiunn-Yang >>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>>>> >>>> >>>> >>> >>
