Hi Rich,
Thanks for the updates. I’m generally happy with the KIP now with
one outstanding comment.

AS5: I think there’s a small error in the interface changes in the KIP.
It seems to me that ProducerInterceptor should be changed to add
the new `onAcknowledgement(RecordMetadata, Exception, Headers)`
method, and this one should have a default implementation which calls
the previous signature. However, there should not be a default
implementation with the current signature.

I think Callback has the same problem. Only the new method
should have a default implementation.


Thanks,
Andrew


> On 7 Aug 2024, at 18:16, Rich C. <chenjy.r...@gmail.com> wrote:
>
> 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