hi Rich

> Header.lastHeader(Iterable<Header>)? That’s an interesting idea, but I
think it falls outside the scope of this KIP. If you’re interested, perhaps
you could start another discussion thread or raise a separate KIP for it.

The APIs included by this KIP is public, and so we can't change it easily
after it gets release even though I filed another KIP to add helper.

Also, that is why I stick on the APIs.

> KafkaProducer already setReadOnly
<
https://github.com/apache/kafka/blob/0123bdcf06d2554ea62ba3a75af7c4b17eb4d23a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java#L1058C13-L1058C24
>
during `doSend`.
It is more of an implementation detail. Overall, I believe the interface of
`Headers` should be kept as is.

What if the callback is invoked on the error path (
https://github.com/apache/kafka/blob/0123bdcf06d2554ea62ba3a75af7c4b17eb4d23a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java#L1111)?
the simple solution is to call `setReadOnly` to make it immutable, so it is
fine.

In fact, I'm not a fan of `Headers` as it uses "exception" to prevent the
modification. IMHO, the better design is to define a read-only interface.
At any rate, that is not related to this KIP.

thanks for having discussion with me. I will +1 to this KIP and file a Jira
to discuss the interface changes of `Headers`

Best,
Chia-Ping




Rich C. <chenjy.r...@gmail.com> 於 2024年8月24日 週六 上午9:30寫道:

> Hi Chia-Ping,
>
> > be we can add public helpers to Header to offer “last header”? The helper
> can cast the Iterable to List (if ok) to get last header effectively
>
> Are you referring to extracting the RecordHeaders#lastHeader()
> <
> https://github.com/apache/kafka/blob/0123bdcf06d2554ea62ba3a75af7c4b17eb4d23a/clients/src/main/java/org/apache/kafka/common/header/internals/RecordHeaders.java#L84-L94
> >
> implementation to a static helper method like
> Header.lastHeader(Iterable<Header>)? That’s an interesting idea, but I
> think it falls outside the scope of this KIP. If you’re interested, perhaps
> you could start another discussion thread or raise a separate KIP for it.
>
> > should we pass a mutable interface to users in those callback function?
>
> This is a great question. Passing read-only Headers to these callbacks
> would maintain a unified experience and also address your concern. In fact,
> KafkaProducer already setReadOnly
> <
> https://github.com/apache/kafka/blob/0123bdcf06d2554ea62ba3a75af7c4b17eb4d23a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java#L1058C13-L1058C24
> >
> during `doSend`.
> It is more of an implementation detail. Overall, I believe the interface of
> `Headers` should be kept as is.
>
> What do you think?
> ```
> onAcknowledgement(RecordMetadata metadata, Exception exception, Headers
> headers)
> onCompletion(RecordMetadata metadata, Exception exception, Headers headers)
> ```
>
> Regards,
> Rich
>
>
> On Fri, Aug 23, 2024 at 2:12 AM Chia-Ping Tsai <chia7...@gmail.com> wrote:
>
> > hi Rich,
> >
> > Thanks for sharing the case. Maybe we can add public helpers to Header to
> > offer “last header”? The helper can cast the Iterable to List (if ok) to
> > get last header effectively
> >
> > Thanks,
> > Chia-Ping
> >
> > >
> > > Rich C. <chenjy.r...@gmail.com> 於 2024年8月23日 中午12:00 寫道:
> > >
> > > Hi Chia-Ping,
> > >
> > > To address your concern, how about we clone the headers as
> RecordHeaders
> > > and then use setReadOnly? This approach will pass immitable interface
> to
> > > callback and won’t affect the developer experience.
> > >
> > > Regards,
> > > Rich
> > >
> > >
> > >> On Thu, Aug 22, 2024 at 23:29 Rich C. <chenjy.r...@gmail.com> wrote:
> > >>
> > >> Hi Chia-Ping,
> > >>
> > >> I agree that `Headers
> > >> <
> >
> https://kafka.apache.org/38/javadoc/org/apache/kafka/common/header/Headers.html
> > >`
> > >> extending `Iterable<Header>` includes unnecessary mutable methods like
> > >> add() and remove(). However, Headers does offer a useful
> `lastHeader()`
> > >> method.
> > >> While I understand your point that it's not overly complex to iterate
> > >> through and get the last header, I'm concerned that using
> > >> `Iterable<Header>` might create a *non-unified developer experience*
> > >> between these callbacks and the existing ProducerRecord.headers()
> > >> <
> >
> https://kafka.apache.org/38/javadoc/org/apache/kafka/clients/producer/ProducerRecord.html#headers()
> > >
> > >> and ConsumerRecord.headers()
> > >> <
> >
> https://kafka.apache.org/38/javadoc/org/apache/kafka/clients/consumer/ConsumerRecord.html#headers()
> > >
> > >> .
> > >>
> > >> Could this be an issue?
> > >>
> > >> Regards,
> > >> Rich
> > >>
> > >>
> > >> On Thu, Aug 22, 2024 at 10:05 PM Chia-Ping Tsai <chia7...@gmail.com>
> > >> wrote:
> > >>
> > >>> hi Rich
> > >>>
> > >>> Headers is a sub class of Iterable<Header> already, so changing the
> > type
> > >>> from Headers to Iterable<Header> does not make code complicated :)
> > >>>
> > >>> The point is “should we pass a mutable interface to users in those
> > >>> callback function?”
> > >>>
> > >>> IMHO, the answer is NO.
> > >>>
> > >>> Best,
> > >>> Chia-Ping
> > >>>
> > >>>>
> > >>>> Rich C. <chenjy.r...@gmail.com> 於 2024年8月23日 上午8:26 寫道:
> > >>>>
> > >>>> Hi Chia-Ping,
> > >>>>
> > >>>> I initially considered `Iterable<Header>`, but eventually went with
> > >>>> `Headers`. Because ProducerRecord.headers()
> > >>>> <
> > >>>
> >
> https://kafka.apache.org/38/javadoc/org/apache/kafka/clients/producer/ProducerRecord.html#headers()
> > >>>>
> > >>>> type is `Headers`.
> > >>>>
> > >>>> Regards,
> > >>>> Rich
> > >>>>
> > >>>>
> > >>>>> On Thu, Aug 22, 2024 at 4:50 PM Chia-Ping Tsai <
> chia7...@apache.org>
> > >>> wrote:
> > >>>>>
> > >>>>> hi Rich
> > >>>>>
> > >>>>> Sorry for late response. I have just one comment:
> > >>>>>
> > >>>>> Have we consider replacing `Headers` by `Iterable<Header>`? There
> are
> > >>> some
> > >>>>> disadvantages of using `Headers`:
> > >>>>>
> > >>>>> 1. `Headers` have many setters and they are meaningless to users.
> > >>>>> 2. If users do want to modify `Headers`, they can get inconsistent
> > >>> results
> > >>>>> as `Headers` can be either readonly of modifiable.
> > >>>>>
> > >>>>> Best,
> > >>>>> Chia-Ping
> > >>>>>
> > >>>>>> On 2024/07/23 03:13:59 "Rich C." wrote:
> > >>>>>> Hi Everyone,
> > >>>>>>
> > >>>>>> I hope this email finds you well.
> > >>>>>>
> > >>>>>> I would like to start a discussion on KIP-512. The initial version
> > of
> > >>>>>> KIP-512 was created in 2019, and I have resurrected it in 2024
> with
> > >>> more
> > >>>>>> details about the motivation behind it.
> > >>>>>>
> > >>>>>> You can view the current version of the KIP here: KIP-512: Make
> > Record
> > >>>>>> Headers Available in onAcknowledgement.
> > >>>>>> <
> > >>>>>
> > >>>
> >
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-512%3A+make+Record+Headers+available+in+onAcknowledgement
> > >>>>>>
> > >>>>>>
> > >>>>>> Let's focus on discussing the necessity of this feature first. If
> we
> > >>>>> agree
> > >>>>>> on its importance, we can then move on to discussing the proposed
> > >>>>> changes.
> > >>>>>>
> > >>>>>> Looking forward to your feedback.
> > >>>>>>
> > >>>>>> Best regards,
> > >>>>>> Rich
> > >>>>>>
> > >>>>>
> > >>>
> > >>
> >
>

Reply via email to