Hi Andrew,

> AS5: there should not be a default implementation with the current
signature

Thanks for pointing that out. But if the existing
`onAcknowledgement(RecordMetadata, Exception)` method doesn't have a
default implementation, users who want to use the new
`onAcknowledgement(RecordMetadata, Exception, Header)` method would need to
implement both. Doesn't that seem redundant? Am I missing something? Here's
an example.

```
public class MyProducerInterceptor implements ProducerInterceptor<Integer,
String> {
    @Override
    public void onAcknowledgement(RecordMetadata metadata, Exception
exception) {
      // implemented because of part of interface and no default
      // never got called
    }

    @Override
    public void onAcknowledgement(RecordMetadata metadata, Exception
exception, Headers headers) {
      // implement my logic here
    }
}
```

Regards,
Rich


On Fri, Aug 9, 2024 at 4:16 AM Andrew Schofield <andrew_schofi...@live.com>
wrote:

> 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