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

Reply via email to