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
> >>>>>> 
> >>>>>> 
> >>>> 
> >>>> 
> >> 
> >> 
> 
> 

Reply via email to