Hi all,

thanks for all the feedback. As most prefer the new interface approach, I
have updated KIP-512
<https://cwiki.apache.org/confluence/display/KAFKA/KIP-512%3A+make+Record+Headers+available+in+onAcknowledgement+and+onComplete>
to reflect that. If no additional feedback comes in the next few days, I
will start a voting thread.

Regards,
Rich


On Wed, Jul 31, 2024 at 10:14 PM Rich C. <chenjy.r...@gmail.com> wrote:

> Hi Matthias,
>
> > (100) To me, Headers store "application metadata" of a record, but they
> are not "Kafka native" record metadata
>
> fair enough.
>
> > (200) extending `onComplete()` and pass in the Headers might be a good
> thing to do, too
>
> I agree it’s a nice feature to have. We can increase the scope for now
> since option 1 already addresses it. If the community agrees on
> `onAcknowledgement` but not on `onCompletion`, we can adjust the scope
> accordingly. I apologize for using the term "edge case"; I would consider
> it a special case.
>
> > (200) [side mark] we should rather change the interceptor interface and
> change the `onSend()` return type to `void`
>
> This is out of scope, but personally, I think returning a new record gives
> developers flexibility. Imagine a ProducerInterceptor mutating two fields.
> Allowing the return of a new record makes it an all-or-nothing operation.
> If a developer chooses to mutate directly, the first mutation might apply
> successfully while the second raises an exception, resulting in a partial
> state success. Additionally, there are other reasons, such as thread safety.
>
> https://www.perplexity.ai/search/why-producerinterceptor-return-XoVscdipTYCtcXUgx6Fbyg
>
> > (300) there could be even other use-case which might benefit from an
> easy access to Headers in the callbacks
>
> I totally agree. Even for latency measurement, I just mentioned to Lianet
> that headers are more generic and helpful in other end-to-end latency
> scenarios.
>
> > (400) If we really go with overloading `onAcknowledgement()` (and maybe
> also `onCompletion()`), and wondering if we should deprecate the existing
> overloads?
>
> I prefer to keep the old interface. This decision is intended to help
> reduce the work required for client upgrades.
>
> Regards,
> Rich
>
>
> On Tue, Jul 30, 2024 at 9:48 PM Matthias J. Sax <mj...@apache.org> wrote:
>
>> Thanks for updating the KIP.
>>
>> (100) As stated previously, I personally don't think that adding Headers
>> to RecordMetadata is the right thing to do. To me, Headers store
>> "application metadata" of a record, but they are not "Kafka native"
>> record metadata (ie metadata Kafka an reason about). Headers are a black
>> box to Kafka, similar to key and value.
>>
>> The JavaDocs of `RecordMetadata` might not be helpful, but I agree with
>> Andrew and Lianet that its original purpose does not fit to the idea to
>> add Headers to it.
>>
>>
>>
>> (200) However, I don't understand the argument about `onComplete()`? Of
>> course, if the interceptor `onSend()` methods modified the headers,
>> `onComplete()` would see the modified record, no the original one. But
>> the same should be true for `onAcknowledgement()` (no matter if we pass
>> the Headers as parameter of via `RecordMetadata`), right?
>>
>> Thus, I would personally argue, that extending `onComplete()` and pass
>> in the Headers might be a good thing to do, too.
>>
>>
>>
>> [side remark] I personally don't agree to the comment on the linked PR
>> (even if this is not relevant to this KIP):
>>
>> > it is not recommended but allowable to create a new ProducerRecord in
>> Interceptor.
>>
>> In the end, `onSend()` has return type `ProducerRecord`, and while I
>> agree that it should be used with care, it seems odd to call it an "edge
>> case", and position it at something that is only "tolerated"... In the
>> end, if we really want to consider modifying a record `onSend()` as bad
>> practice, we should rather change the interceptor interface and change
>> the `onSend()` return type to `void`.
>>
>>
>>
>> (300) About Lianet's idea to just track "producer local timestamp" and
>> pass into the callback: I find it interesting, but I am not totally sure
>> if we might make it too complicated?
>>
>> In general, I believe that we should actually have a much larger change
>> to the Kafka message format, and always store the producer provided
>> "create timestamp" plus the broker side "log append timestamp". For this
>> case, `RecordMetadata` would be extended to also provide both
>> timestamps. Of course, changing the message format is totally
>> out-of-scope for this KIP, and I don't propose to tackle it with this
>> KIP. However, if we would want to be forward looking (and optimistically
>> assume that we might change the message format at some point in the
>> future accordingly), we could actually deprecate the existing
>> `RecordMetadata#timestamp()` method, and add `#createTimestamp()` and
>> `#logAppendTimestamp()` methods, and clearly document their semantics
>> with regard to the corresponding "CreateTime" vs "AppendTime" topic
>> config.
>>
>> The disadvantage I see is, that we do something that might never happen
>> in the Kafka message format, and that we would limit the scope of this
>> KIP to the "measure latency" use-case only.
>>
>> The KIP also mentioned tracing as use-case which could benefit to access
>> Headers in the callback what I find convincing. I don't see a good
>> reason why we would want to exclude this use-case? -- And frankly, there
>> could be even other use-case which might benefit from an easy access to
>> Headers in the callbacks.
>>
>>
>>
>> (400) If we really go with overloading `onAcknowledgement()` (and maybe
>> also `onCompletion()`), and wondering if we should deprecate the
>> existing overloads? Given that this idea is current a "rejected
>> alternative" it ok that the KIP is not specific about it, however, if we
>> would actually do it this way, we should consider it.
>>
>>
>>
>> -Matthias
>>
>>
>>
>> On 7/30/24 12:06 PM, Lianet M. wrote:
>> > Hello Rich, thanks for resurrecting the KIP, seems to fill a gap indeed.
>> >
>> > LM1. Specifically related to motivation#1. ProducerRecord already has a
>> > timestamp, passed into the RecordMetadata, that represents the creation
>> > time provided on new ProducerRecord, so couldn't we reuse it to avoid
>> the
>> > extra complexity of having to "include a timestamp in the header when
>> the
>> > message is sent" to be able to compute latency properly. The challenge
>> of
>> > course is that that timestamp may be overwritten (and this is the root
>> > cause of the gap), but that could be resolved just by keeping the
>> original
>> > time and making it available.
>> > RecordMetadata would keep a timestamp (passed from the record creation,
>> > never mutated), and the "effectiveTimestamp" (the one it currently has,
>> > updated with the broker result based on configs). Main advantage would
>> be
>> > not having to add a header for calculating latency. The user simply
>> creates
>> > the record with a timestamp (known existing concept), and we make that
>> > value accessible in the RecordMetadata (where it exists already at some
>> > point, but it's mutated). Thoughts?
>> >
>> > LM2. Regardless of the point above, if we think having the headers
>> > available on the onAcknowledgement would be helpful, I definitely see
>> the
>> > case for both alternatives (headers in RecordMetadata and as param). I
>> > share Andrew's feeling because Headers are indeed part of the
>> > ProducerRecord. But then headers will in practice simply contain info
>> > related to the record, so it seems sensible to expect to find headers in
>> > the RecordMetadata as you suggest, ok with me.
>> >
>> > Thanks!
>> >
>> > Lianet
>> >
>> > On Mon, Jul 29, 2024 at 9:41 PM Rich C. <chenjy.r...@gmail.com> wrote:
>> >
>> >> Hi Andrew,
>> >>
>> >> Thanks for the feedback. I have updated KIP-512 and addressed AS2,
>> AS3, and
>> >> AS4. For AS1, let's wait for further responses from the community.
>> >>
>> >>
>> >> Regards,
>> >> Rich
>> >>
>> >>
>> >> On Mon, Jul 29, 2024 at 5:59 AM Andrew Schofield <
>> >> andrew_schofi...@live.com>
>> >> wrote:
>> >>
>> >>> Hi,
>> >>> Thanks for adding the detail. It seems quite straightforward to
>> >>> implement in the producer code.
>> >>>
>> >>> AS1: Personally, and of course this is a matter of taste and just one
>> >>> opinion, I don’t like adding Headers to RecordMetadata. It seems to me
>> >>> that RecordMetadata is information about the record that’s been
>> produced
>> >>> whereas the Headers are really part of the record itself. So, I prefer
>> >> the
>> >>> alternative which overloads ProducerInterceptor.onAcknowledgement.
>> >>>
>> >>> AS2: ProducerBatch and FutureRecordMetadata are both internal classes
>> >>> and do not need to be documented in the KIP.
>> >>>
>> >>> AS3: This KIP is adding rather than replcaing the constructor for
>> >>> RecordMetadata.
>> >>> You should define the value for the Headers if an existing constructor
>> >>> without headers is used.
>> >>>
>> >>> AS4: You should add a method `Headers headers()` to RecordMetadata.
>> >>>
>> >>>
>> >>> I wonder what other community members think about whether it’s a good
>> >>> idea to extend RecordMetadata with the headers.
>> >>>
>> >>> Thanks,
>> >>> Andrew
>> >>>
>> >>>> On 29 Jul 2024, at 05:36, Rich C. <chenjy.r...@gmail.com> wrote:
>> >>>>
>> >>>> Hi all,
>> >>>>
>> >>>> Thank you for the positive feedback. I added proposal changes to
>> >> KIP-512
>> >>>> and included a FAQ section to address some concerns.
>> >>>>
>> >>>> Hi Andrew, yes, this KIP focuses on
>> >>>> `ProducerInterceptor.onAcknowledgement`. I added FAQ#3 to explain
>> that.
>> >>>>
>> >>>> Hi Matthias, for your question about "RecordMetadata being Kafka
>> >>> metadata" in
>> >>>> this thread
>> >>>> <
>> >>>
>> >>
>> https://lists.apache.org/list?dev@kafka.apache.org:lte=1M:make%20Record%20Headers%20available%20in%20onAcknowledgement
>> >>>> ,
>> >>>> I added FAQ#2 to explain that. If I have missed any documentation
>> >>> regarding
>> >>>> the design of RecordMetadata, please let me know.
>> >>>>
>> >>>> Regards,
>> >>>> Rich
>> >>>>
>> >>>>
>> >>>> On Fri, Jul 26, 2024 at 4:00 PM Andrew Schofield <
>> >>> andrew_schofi...@live.com>
>> >>>> wrote:
>> >>>>
>> >>>>> Hi Rich,
>> >>>>> Thanks for resurrecting this KIP. It seems like a useful idea to me
>> >> and
>> >>>>> I’d be interested in seeing the proposed public interfaces.
>> >>>>>
>> >>>>> I note that you specifically called out the
>> >>>>> ProducerInterceptor.onAcknowledgement
>> >>>>> method, as opposed to the producer Callback.onCompletion method.
>> >>>>>
>> >>>>> Thanks,
>> >>>>> Andrew
>> >>>>>
>> >>>>>> On 26 Jul 2024, at 04:54, Rich C. <chenjy.r...@gmail.com> wrote:
>> >>>>>>
>> >>>>>> Hi Kevin,
>> >>>>>>
>> >>>>>> Thanks for your support.
>> >>>>>>
>> >>>>>> Hi Matthias,
>> >>>>>>
>> >>>>>> I apologize for the confusion. I've deleted the Public Interface
>> >>> sections
>> >>>>>> for now. I think we should focus on discussing its necessity with
>> the
>> >>>>>> community. I'll let it sit for a few more days, and if there are no
>> >>>>>> objections, I will propose changes over the weekend and share them
>> >> here
>> >>>>>> again.
>> >>>>>>
>> >>>>>> Regards,
>> >>>>>> Rich
>> >>>>>>
>> >>>>>>
>> >>>>>> On Thu, Jul 25, 2024 at 5:51 PM Matthias J. Sax <mj...@apache.org>
>> >>>>> wrote:
>> >>>>>>
>> >>>>>>> Rich,
>> >>>>>>>
>> >>>>>>> thanks for resurrecting this KIP. I was not part of the original
>> >>>>>>> discussion back in the day, but personally agree with your
>> >> assessment
>> >>>>>>> that making headers available in the callbacks would make
>> >> developer's
>> >>>>>>> life much simpler.
>> >>>>>>>
>> >>>>>>> For the KIP itself, starting with "Public Interface" section,
>> >>> everything
>> >>>>>>> is formatted as "strike through". Can you fix this? It's confusing
>> >> as
>> >>>>>>> it's apparently not correctly formatted, but unclear which (if
>> any)
>> >>>>>>> parts should be formatted like this. In general, wiki pages have
>> >>>>>>> history, so strike-through should be used rather rarely but the
>> wiki
>> >>>>>>> page should just contain the latest proposal. (If one want to see
>> >> the
>> >>>>>>> history, it's there anyway).
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> -Matthias
>> >>>>>>>
>> >>>>>>> On 7/23/24 6:36 AM, Kevin Lam wrote:
>> >>>>>>>> Hi,
>> >>>>>>>>
>> >>>>>>>> Thanks for starting the discussion. Latency Measurement and
>> Tracing
>> >>>>>>>> Completeness are both good reasons to support this feature, and
>> >> would
>> >>>>> be
>> >>>>>>>> interested to see this move forward.
>> >>>>>>>>
>> >>>>>>>> On Mon, Jul 22, 2024 at 11:15 PM Rich C. <chenjy.r...@gmail.com>
>> >>>>> 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