Thanks, Matthias. KIP is updated with the APIs. On Tue, 15 Mar 2022 at 23:28, Matthias J. Sax <mj...@apache.org> wrote:
> Thanks. > > It would be good to add the concrete interfaces of the new classed to > the KIP, ie, > > - FixedKeyProcessorSupplier > - FixedKeyProcessor > - FixedKeyProcessorContext > - FixedKeyRecord > > > -Matthias > > > On 3/10/22 3:15 PM, Jorge Esteban Quilcate Otoya wrote: > > Thanks all! > > > > I agree with Matthias and Jon on going forward with the new > > `FixedKeyRecord` approach. > > The KIP has been updated accordingly. > > > > Feel free to add your vote or amend on the vote thread if needed. > > > > Cheers, > > > > On Mon, 7 Mar 2022 at 21:57, Matthias J. Sax <mj...@apache.org> wrote: > > > >> I think it's ok that we cannot prevent users from mutating a given > >> read-only object. We have similar issues "all over the place" in the > >> API, because it's just how Java works unfortunately (eg, > >> `ValueMapperWithKey` and similar interfaces). > >> > >> The point being is, that the API clearly expresses that the key should > >> not be changes, as `FixedKeyRecord` as not `withKey()` method, what is > >> much better then having `Record.withKey()` and thus incorrectly > >> indicating to user that it would be ok to set a new key. > >> > >> I think it's worth to add the new interfaces. > >> > >> > >> -Matthias > >> > >> > >> On 3/7/22 11:46 AM, Guozhang Wang wrote: > >>> Thanks John! I feel a bit ashamed of just thinking loud here without > >> trying > >>> out prototypes myself :P > >>> > >>> I think the FixedKeyProcessor/Record looks very good -- like you said, > >>> since we are making a new set of APIs then why don't we reconsider more > >>> bolderly -- but at the same time I'd also like to make sure we agree on > >> how > >>> much "safety" we can achieve in runtime: even with the proposed APIs, > we > >>> cannot prevent users doing something like: > >>> > >>> --------------- > >>> process(FixedKeyRecord inputRecord) { > >>> inputRecord.key().modifyField(...); // this is not preventable > with > >>> runtime key validations either since we just check the key object > itself > >> is > >>> not replaced > >>> context.forward(inputRecord); > >>> } > >>> > >>> --------------- > >>> > >>> I.e. in either type-safety or runtime validation, we cannot be 100% > safe > >>> that users would not do anything wrong. This drives me to think, how > much > >>> we'd like to pay to "remind" (instead of say "enforce", since we cannot > >>> really do it) users the semantics of "processValue". Personally I felt > >> that > >>> adding the new set of APIs for that purpose only is a bit overkill, and > >>> hence was leaning towards just the runtime validation. But I admit this > >> is > >>> purely subjective so I'm willing to yield to the group if others feel > >> it's > >>> worthy to do so. > >>> > >>> > >>> Guozhang > >>> > >>> > >>> > >>> On Mon, Mar 7, 2022 at 10:32 AM Jorge Esteban Quilcate Otoya < > >>> quilcate.jo...@gmail.com> wrote: > >>> > >>>> Thanks, John! > >>>> This looks very promising. > >>>> > >>>> I will familiarize this approach and update the KIP accordingly. From > >> what > >>>> I can see so far, this should cover most of the open issues in this > >>>> proposal. > >>>> > >>>> PS. > >>>> > >>>>> Just as a reminder, the current approach with transformers > >>>>> is NOT enforced at compile time. Transformers have access to > >>>>> a "forwarding disabled" processor context, which still has > >>>>> the forward methods that throw a runtime exception when > >>>>> invoked. > >>>> > >>>> Agree. I was referring to the value transformers where `readOnlyKey` > is > >>>> passed but not forwarded internally. Though about the "forwarding > >> disabled" > >>>> approach, you're totally right that is a runtime validation. > >>>> Regardless, the approach proposed here will be a much better one. > >>>> > >>>> > >>>> On Sun, 6 Mar 2022 at 18:59, John Roesler <vvcep...@apache.org> > wrote: > >>>> > >>>>> Hello all, > >>>>> > >>>>> It seems like we're making good progress on this discussion. > >>>>> If I'm keeping track correctly, if we can resolve this > >>>>> question about how to handle processValues(), then we should > >>>>> be able to finalize the vote, right? > >>>>> > >>>>> I share Matthias's preference for having a type-safe API. > >>>>> > >>>>> Just as a reminder, the current approach with transformers > >>>>> is NOT enforced at compile time. Transformers have access to > >>>>> a "forwarding disabled" processor context, which still has > >>>>> the forward methods that throw a runtime exception when > >>>>> invoked. > >>>>> > >>>>> However, the spirit of the "new processor api" line of work > >>>>> is to clean up a lot of the cruft around the original > >>>>> processor API, so this is a good opportunity to introduce a > >>>>> type-safe version if we can. > >>>>> > >>>>> Based on my experience adding the new processor API, I felt > >>>>> like it should be possible to do what he suggests, but it > >>>>> would be more involved than what he said. The biggest thing > >>>>> I learned from that effort, though, is that you really have > >>>>> to just try it to see what all the complications are. > >>>>> > >>>>> With that in mind, I went ahead and implemented the > >>>>> suggestion: https://github.com/apache/kafka/pull/11854 > >>>>> > >>>>> This is a functional prototype. It only adds processValues, > >>>>> which takes a supplier of a new type, FixedKeyProcessor. > >>>>> That processor only processes FixedKeyRecords, which have a > >>>>> key that cannot be changed. FixedKeyProcessors have a > >>>>> special context, a FixedKeyProcessorContext, which can only > >>>>> forward FixedKeyRecords. > >>>>> > >>>>> FixedKeyRecords have "fixed keys" because its key can only > >>>>> be set in the constructor, and its constructor is package- > >>>>> private. > >>>>> > >>>>> As you can see, this new record/processor/context ecosystem > >>>>> is an independent peer of the general one. This is necessary > >>>>> to ensure the desired compiler check. For example, if > >>>>> FixedKeyRecord were merely an interface implemented by > >>>>> Record, then users could create a new Record with a new key > >>>>> and forward it as a FixedKeyRecord, violating the > >>>>> constraint. > >>>>> > >>>>> As I said, with this proposal, the devil is in the details, > >>>>> so if anyone thinks the API can be simplified, I suggest you > >>>>> check out the branch and try out your proposal. I'd be very > >>>>> happy to have a simplier solution, but I'm also pretty sure > >>>>> this complexity is necessary. > >>>>> > >>>>> Taking a step back, I do think this approach results in a > >>>>> better API, even though the change is a little complicated. > >>>>> > >>>>> Thanks, > >>>>> -John > >>>>> > >>>>> On Sun, 2022-03-06 at 10:51 +0000, Jorge Esteban Quilcate > >>>>> Otoya wrote: > >>>>>> Matthias, thanks for your feedback. > >>>>>> > >>>>>> I can see the following alternatives to deal with `processValues()`: > >>>>>> > >>>>>> 1. Runtime key validation (current proposal) > >>>>>> 2. Using Void type. Guozhang already points out some important > >>>>>> considerations about allocating `Record` twice. > >>>>>> 3. Adding a new ValueRecord, proposed by Matthias. This one would > >> carry > >>>>>> some of the problems of the second alternative as ValueRecord will > >> have > >>>>> to > >>>>>> be created from a Record. Also, either by having a public > constructor > >>>> or > >>>>>> creation from a Record, the key _can_ be changed without being > >> captured > >>>>> by > >>>>>> the Topology. > >>>>>> 4. Reducing the KIP scope to `process` only, and removing/postponing > >>>>>> `processValues` for a later DSL redesign. > >>>>>> > >>>>>> A couple of additional comments: > >>>>>> > >>>>>> About the Record API: > >>>>>> > >>>>>> IIUC, the issue with allocating new objects is coming from the > current > >>>>>> design of the Record API. > >>>>>> If a user does record.withKey(...).withValue(...) is already leading > >>>> to a > >>>>>> couple of instatiations. > >>>>>> My impression is that if the cost/value of immutability has been > >>>> weighed > >>>>>> already, then maybe the considerations for alternative 2 can be > >>>>> disregarded? > >>>>>> Either way, if the cost of recreation of objects is something we > want > >>>> to > >>>>>> minimize, then maybe adding a Builder to the record should help to > >>>> reduce > >>>>>> the allocations. > >>>>>> > >>>>>> About the key validation: > >>>>>> > >>>>>> So far, the only way I can see to _really_ validate a key doesn't > >>>> change > >>>>> at > >>>>>> compile-time is by not exposing it at all — as we are doing it today > >>>> with > >>>>>> Transform. > >>>>>> Otherwise, deal with it at runtime — as we have been dealing with > >>>>> Transform > >>>>>> without the ability to forward. > >>>>>> Processor API already —by definition— means lower-level abstraction, > >>>>>> therefore users should be aware of the potential runtime exceptions > if > >>>>> the > >>>>>> key changes. > >>>>>> This is why I'm leaning towards alternative 1. > >>>>>> > >>>>>> Looking forward to your feedback. > >>>>>> As a reminder, the vote thread is still open. Feel free to add your > >>>> vote > >>>>> or > >>>>>> amend if needed. > >>>>>> > >>>>>> Cheers, > >>>>>> > >>>>>> > >>>>>> On Fri, 4 Mar 2022 at 06:51, Matthias J. Sax <mj...@apache.org> > >> wrote: > >>>>>> > >>>>>>> John, thanks for verifying source compatibility. My impression was > >>>> that > >>>>>>> it should be source compatible, I was just not 100% sure. > >>>>>>> > >>>>>>> The question about `processValues()` is really a hard one. > Guozhang's > >>>>>>> point is very good one. Maybe we need to be pragmatic and accept > the > >>>>>>> runtime check (even if I deeply hate this solution compare to a > >>>> compile > >>>>>>> time check). > >>>>>>> > >>>>>>> Other possibilities to address this issue might just become too > ugly? > >>>>> It > >>>>>>> seems it would require to add a new `ValueProcessorContext` that > >>>> offers > >>>>>>> a `#forward(ValueRecord)` method (with `ValueRecord` being a > `Record` > >>>>>>> with immutable key? Not sure if we would be willing to go down this > >>>>>>> route? Personally, I would be ok with it, as a strongly prefer > >>>> compile > >>>>>>> time checks and I am happy to extend the API surface area to > achieve > >>>> it > >>>>>>> -- however, I won't be surprised if others don't like this idea... > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> -Matthias > >>>>>>> > >>>>>>> On 2/27/22 6:20 AM, Jorge Esteban Quilcate Otoya wrote: > >>>>>>>> Thanks, Guozhang. > >>>>>>>> > >>>>>>>>> Compared with reference checks and runtime exceptions for those > >>>> who > >>>>>>>>> mistakenly change the key, I think that enforcing everyone to > >>>>> `setValue` > >>>>>>>>> may incur more costs.. > >>>>>>>> > >>>>>>>> This is a fair point. I agree that this may incur in more costs > >>>> than > >>>>> key > >>>>>>>> checking. > >>>>>>>> > >>>>>>>> Will hold for more feedback, but if we agree I will update the KIP > >>>>> during > >>>>>>>> the week. > >>>>>>>> > >>>>>>>> Cheers, > >>>>>>>> Jorge. > >>>>>>>> > >>>>>>>> > >>>>>>>> On Sun, 27 Feb 2022 at 00:50, Guozhang Wang <wangg...@gmail.com> > >>>>> wrote: > >>>>>>>> > >>>>>>>>> Hello folks, > >>>>>>>>> > >>>>>>>>> Regarding the outstanding question, I'm actually a bit leaning > >>>>> towards > >>>>>>> the > >>>>>>>>> second option since that `withKey()` itself always creates a new > >>>>> Record > >>>>>>>>> object. This has a few implications: > >>>>>>>>> > >>>>>>>>> * That we would have to discard the previous Record object to be > >>>>> GC'ed > >>>>>>> with > >>>>>>>>> the new object --- note in practice, processing value does not > >>>> mean > >>>>>>> you'd > >>>>>>>>> have to replace the whole value with `withValue`, but maybe you > >>>>> just > >>>>>>> need > >>>>>>>>> to manipulate some fields of the value object if it is a JSon / > >>>>> etc. > >>>>>>>>> * It may become an obstacle for further runtime optimizations > >>>> e.g. > >>>>> skip > >>>>>>>>> serdes and interpret processing as direct byte manipulations. > >>>>>>>>> > >>>>>>>>> Compared with reference checks and runtime exceptions for those > >>>> who > >>>>>>>>> mistakenly change the key, I think that enforcing everyone to > >>>>> `setValue` > >>>>>>>>> may incur more costs.. > >>>>>>>>> > >>>>>>>>> Guozhang > >>>>>>>>> > >>>>>>>>> On Fri, Feb 25, 2022 at 12:54 PM Jorge Esteban Quilcate Otoya < > >>>>>>>>> quilcate.jo...@gmail.com> wrote: > >>>>>>>>> > >>>>>>>>>> Hi all, > >>>>>>>>>> > >>>>>>>>>> Appreciate very much all the great feedback received so far. > >>>>>>>>>> > >>>>>>>>>>> After applying that interface change, I don't see any syntax > >>>>>>>>>> errors in our tests (which use those methods), and the > >>>>>>>>>> StreamBuilderTest still passes for me. > >>>>>>>>>> > >>>>>>>>>> This is awesome John, thank you for your efforts here. > >>>>>>>>>> > >>>>>>>>>>> Jorge, do you mind clarifying these points in the > >>>> Compatibility > >>>>>>> section > >>>>>>>>>> of your KIP? > >>>>>>>>>> > >>>>>>>>>> +1. I have clarified the impact of changing the return type in > >>>>> the KIP. > >>>>>>>>>> > >>>>>>>>>>> I think the other outstanding question for you is whether > >>>>>>>>>>> the output key type for processValues should be K or Void. > >>>>>>>>>>> > >>>>>>>>>>> One thing I realized belatedly was that if we do set it to > >>>>>>>>>>> Void, then users will actually have to override the key when > >>>>>>>>>>> forwarding, like `record.withKey(null)`, whereas if we keep > >>>>>>>>>>> it is K, all users have to do is not touch the key at all. > >>>>>>>>>> > >>>>>>>>>> This is a tricky one. > >>>>>>>>>> On one hand, with Void type for key output, we force the users > >>>>> to cast > >>>>>>> to > >>>>>>>>>> Void and change the key to null, > >>>>>>>>>> though this can be documented on the API, so the users are > >>>> aware > >>>>> of the > >>>>>>>>>> peculiarity of forwarding within `processValues`. > >>>>>>>>>> On the other hand, keeping the key type as output doesn't > >>>>> _require_ to > >>>>>>> do > >>>>>>>>>> any change of keys, > >>>>>>>>>> but this could lead to key-checking runtime exceptions. > >>>>>>>>>> > >>>>>>>>>> I slightly inclined myself for the first option and change the > >>>>> type to > >>>>>>>>>> `Void`. > >>>>>>>>>> This will impose a bit of pain on the users to gain some > >>>>> type-safety > >>>>>>> and > >>>>>>>>>> avoid runtime exceptions. > >>>>>>>>>> We can justify this requirement as a way to prove that the key > >>>>> hasn't > >>>>>>>>>> changed. > >>>>>>>>>> > >>>>>>>>>> Btw, thanks for this idea Matthias! > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> On Fri, 25 Feb 2022 at 17:10, John Roesler < > >>>> vvcep...@apache.org> > >>>>>>> wrote: > >>>>>>>>>> > >>>>>>>>>>> Oh, one more thing Jorge, > >>>>>>>>>>> > >>>>>>>>>>> I think the other outstanding question for you is whether > >>>>>>>>>>> the output key type for processValues should be K or Void. I > >>>>>>>>>>> get the impression that all of us don't feel too strongly > >>>>>>>>>>> about it, so I think the ball is in your court to consider > >>>>>>>>>>> everyone's points and make a call (with justification). > >>>>>>>>>>> > >>>>>>>>>>> One thing I realized belatedly was that if we do set it to > >>>>>>>>>>> Void, then users will actually have to override the key when > >>>>>>>>>>> forwarding, like `record.withKey(null)`, whereas if we keep > >>>>>>>>>>> it as K, all users have to do is not touch the key at all. > >>>>>>>>>>> > >>>>>>>>>>> Thanks, > >>>>>>>>>>> -John > >>>>>>>>>>> > >>>>>>>>>>> On Fri, 2022-02-25 at 11:07 -0600, John Roesler wrote: > >>>>>>>>>>>> Hello all, > >>>>>>>>>>>> > >>>>>>>>>>>> I'll chime in again in the interest of trying to do a > >>>> better > >>>>>>>>>>>> job of keeping KIPs moving forward... > >>>>>>>>>>>> > >>>>>>>>>>>> Matthias raised some very good questions about whether the > >>>>>>>>>>>> change is really source compatible. I just checked out the > >>>>>>>>>>>> code and make the interface change that Jorge specified in > >>>>>>>>>>>> the KIP: > >>>>>>>>>>>> > >>>>>>>>>>>>> Modified methods: > >>>>>>>>>>>>> > >>>>>>>>>>>>> KStream<KOut,VOut> KStream#process(ProcessorSupplier<K, > >>>> V, > >>>>>>>>>>>> KOut, VOut> processorSupplier, String... stateStoreNames) > >>>>>>>>>>>>> KStream<KOut,VOut> KStream#process(ProcessorSupplier<K, > >>>> V, > >>>>>>>>>>>> KOut, VOut> processorSupplier, Named named, String... > >>>>>>>>>>>> stateStoreNames) > >>>>>>>>>>>> > >>>>>>>>>>>> After applying that interface change, I don't see any > >>>> syntax > >>>>>>>>>>>> errors in our tests (which use those methods), and the > >>>>>>>>>>>> StreamBuilderTest still passes for me. > >>>>>>>>>>>> > >>>>>>>>>>>> The reason is that the existing API already takes a > >>>>>>>>>>>> ProcessorSupplier<K, V, Void, Void> and is currently a > >>>>>>>>>>>> `void` return. > >>>>>>>>>>>> > >>>>>>>>>>>> After this interface change, all existing usages will just > >>>>>>>>>>>> bind Void to KOut and Void to VOut. In other words, KOut, > >>>>>>>>>>>> which is short for `KOut extends Object` is an upper bound > >>>>>>>>>>>> on Void, so all existing processor suppliers are still > >>>> valid > >>>>>>>>>>>> arguments. > >>>>>>>>>>>> > >>>>>>>>>>>> Because the current methods are void returns, no existing > >>>>>>>>>>>> code could be assigning the result to any variable, so > >>>>>>>>>>>> moving from a void return to a typed return is always > >>>>>>>>>>>> compatible. > >>>>>>>>>>>> > >>>>>>>>>>>> Jorge, do you mind clarifying these points in the > >>>>>>>>>>>> Compatibility section of your KIP? > >>>>>>>>>>>> > >>>>>>>>>>>> Thanks, > >>>>>>>>>>>> -John > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> On Wed, 2022-02-23 at 15:07 -0800, Matthias J. Sax wrote: > >>>>>>>>>>>>> For this KIP, I also see the value. I was just trying to > >>>>> make a > >>>>>>>>> step > >>>>>>>>>>>>> back and ask if it's a good short term solution. If we > >>>>> believe it > >>>>>>>>> is, > >>>>>>>>>>> I > >>>>>>>>>>>>> am fine with it. > >>>>>>>>>>>>> > >>>>>>>>>>>>> (I am more worried about the header's KIP...) > >>>>>>>>>>>>> > >>>>>>>>>>>>> Btw: I am still wondering if we can change existing > >>>>> `process()` as > >>>>>>>>>>>>> proposed in the KIP? It the propose change source > >>>>> compatible? (It's > >>>>>>>>>>> for > >>>>>>>>>>>>> sure not binary compatible, but this seems fine -- I > >>>> don't > >>>>> think we > >>>>>>>>>>>>> guarantee binary compatibility). > >>>>>>>>>>>>> > >>>>>>>>>>>>> Btw: would be good to clarify what is changes for > >>>>> process() -- > >>>>>>>>> should > >>>>>>>>>>> be > >>>>>>>>>>>>> return type change from `void` to `KStream<KOut, VOut>` > >>>> as > >>>>> well as > >>>>>>>>>>>>> change of `ProcessorSupplier` generic types (output types > >>>>> change > >>>>>>>>> from > >>>>>>>>>>>>> `Void` to `KOut` and `VOut`? > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> -Matthias > >>>>>>>>>>>>> > >>>>>>>>>>>>> On 2/23/22 11:32 AM, Guozhang Wang wrote: > >>>>>>>>>>>>>> Hi folks, > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> I agree with John that this KIP by itself could be a > >>>> good > >>>>>>>>>>> improvement, and > >>>>>>>>>>>>>> I feel it aligns well with the eventual DSL 2.0 > >>>> proposal > >>>>> so we do > >>>>>>>>>>> not need > >>>>>>>>>>>>>> to hold it until later. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Regarding the last point (i.e. whether we should do > >>>>> enforcement > >>>>>>>>>> with > >>>>>>>>>>> a new > >>>>>>>>>>>>>> interface), here's my 2c: in the past we introduced > >>>>> public > >>>>>>>>>>>>>> `ValueTransfomer/etc` for two purposes, 1) to enforce > >>>>> the key is > >>>>>>>>>> not > >>>>>>>>>>>>>> modifiable, 2) to indicate inside the library's > >>>> topology > >>>>> builder > >>>>>>>>>>> itself > >>>>>>>>>>>>>> that since the key is not modified, the direct > >>>>> downstream does > >>>>>>>>> not > >>>>>>>>>>> need to > >>>>>>>>>>>>>> inject a repartition stage. I think we are more or less > >>>>> on the > >>>>>>>>> same > >>>>>>>>>>> page > >>>>>>>>>>>>>> that for purpose 1), doing runtime check could be > >>>>> sufficient; as > >>>>>>>>>> for > >>>>>>>>>>> the > >>>>>>>>>>>>>> purpose of 2), as for this KIP itself I think it is > >>>>> similar to > >>>>>>>>> what > >>>>>>>>>>> we have > >>>>>>>>>>>>>> (i.e. just base on the function name "processValue" > >>>>> itself) and > >>>>>>>>>>> hence are > >>>>>>>>>>>>>> not sacrificed either. I do not know if > >>>>>>>>>>>>>> `KStream#processValue(ProcessorSupplier<K, V, Void, > >>>> VOut> > >>>>>>>>>>>>>> processorSupplier)` will work, or work better, maybe > >>>>> Jorge could > >>>>>>>>> do > >>>>>>>>>>> some > >>>>>>>>>>>>>> digging and get back to us. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> On Fri, Feb 18, 2022 at 8:24 AM John Roesler < > >>>>>>>>> vvcep...@apache.org> > >>>>>>>>>>> wrote: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Hello all, > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> While I sympathize with Matthias’s desire to wipe the > >>>>> slate > >>>>>>>>> clean > >>>>>>>>>>> and > >>>>>>>>>>>>>>> redesign the dsl with full knowledge of everything > >>>>> we’ve > >>>>>>>>> learned > >>>>>>>>>>> in the > >>>>>>>>>>>>>>> past few years, that would also be a pretty intense > >>>>> project on > >>>>>>>>>> its > >>>>>>>>>>> own. It > >>>>>>>>>>>>>>> seems better to leave that project for someone who is > >>>>> motivated > >>>>>>>>>> to > >>>>>>>>>>> take it > >>>>>>>>>>>>>>> on. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Reading between the lines, it seems like Jorge’s > >>>>> motivation is > >>>>>>>>>>> more along > >>>>>>>>>>>>>>> the lines of removing a few specific pain points. I > >>>>> appreciate > >>>>>>>>>>> Matthias > >>>>>>>>>>>>>>> extending the offer, but if Jorge doesn’t want to > >>>>> redesign the > >>>>>>>>>> dsl > >>>>>>>>>>> right > >>>>>>>>>>>>>>> now, we’re better off just accepting the work he’s > >>>>> willing to > >>>>>>>>> do. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Specifically, this KIP is quite a nice improvement. > >>>>> Looking at > >>>>>>>>>> the > >>>>>>>>>>> KStream > >>>>>>>>>>>>>>> interface, roughly half of it is devoted to various > >>>>> flavors of > >>>>>>>>>>> “transform”, > >>>>>>>>>>>>>>> which makes it really hard on users to figure out > >>>>> which they > >>>>>>>>> are > >>>>>>>>>>> supposed > >>>>>>>>>>>>>>> to use for what purpose. This kip let us drop all > >>>> that > >>>>>>>>> complexity > >>>>>>>>>>> in favor > >>>>>>>>>>>>>>> of just two methods, thanks to the fact that we now > >>>>> have the > >>>>>>>>>>> ability for > >>>>>>>>>>>>>>> processors to specify their forwarding type. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> By the way, I really like Matthias’s suggestion to > >>>> set > >>>>> the KOut > >>>>>>>>>>> generic > >>>>>>>>>>>>>>> bound to Void for processValues. Then, instead of > >>>>> doing an > >>>>>>>>>>> equality check > >>>>>>>>>>>>>>> on the key during forward, you’d just set the key > >>>> back > >>>>> to the > >>>>>>>>> one > >>>>>>>>>>> saved > >>>>>>>>>>>>>>> before processing (with setRecordKey). This is both > >>>>> more > >>>>>>>>>> efficient > >>>>>>>>>>> (because > >>>>>>>>>>>>>>> we don’t have the equality check) and more foolproof > >>>>> for users > >>>>>>>>>>> (because > >>>>>>>>>>>>>>> it’s enforced by the compiler instead of the > >>>> runtime). > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Thanks, all! > >>>>>>>>>>>>>>> -John > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Fri, Feb 18, 2022, at 00:43, Jorge Esteban > >>>> Quilcate > >>>>> Otoya > >>>>>>>>>> wrote: > >>>>>>>>>>>>>>>> On Fri, 18 Feb 2022 at 02:16, Matthias J. Sax < > >>>>>>>>>> mj...@apache.org> > >>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> It probably deserves its own thread to start > >>>>> discussing > >>>>>>>>>>> ideas. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Yes. My question was: if we think it's time to do > >>>>> a DSL > >>>>>>>>> 2.0, > >>>>>>>>>>> should we > >>>>>>>>>>>>>>>>> drop this KIP and just fix via DSL 2.0 instead? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Good question. Would love to hear what others think > >>>>> about > >>>>>>>>> this. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> I've stated my position about this here: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> For this KIP specifically, I think about it as a > >>>>>>>>> continuation > >>>>>>>>>>> from > >>>>>>>>>>>>>>>> KIP-478. Therefore, it could make sense to have it > >>>>> as part of > >>>>>>>>>>> the current > >>>>>>>>>>>>>>>> version of the DSL. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> I'd even add that if this KIP is adopted, I would > >>>>> not be that > >>>>>>>>>>>>>>> disappointed > >>>>>>>>>>>>>>>> if KIP-634 is dropped in favor of a DSL v2.0 as the > >>>>> access to > >>>>>>>>>>> headers > >>>>>>>>>>>>>>>> provided by KIP-478's via Record API is much better > >>>>> than > >>>>>>>>>> previous > >>>>>>>>>>>>>>>> `.context().headers()`. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> But happy to reconsider if there is an agreement to > >>>>> focus > >>>>>>>>>> efforts > >>>>>>>>>>>>>>> towards a > >>>>>>>>>>>>>>>> DSL 2.0. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> You're right. I'm not proposing the method > >>>>> signature. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> What signature do you propose? I don't see an > >>>>> update on the > >>>>>>>>>>> KIP. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> My bad. I have clarified this in the KIP's public > >>>>>>>>> interfaces > >>>>>>>>>>> now: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> ``` > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> New methods: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> - KStream<K,VOut> > >>>>>>>>>> KStream#processValues(ProcessorSupplier<K, > >>>>>>>>>>> V, K, > >>>>>>>>>>>>>>> VOut> > >>>>>>>>>>>>>>>> processorSupplier, String... stateStoreNames) > >>>>>>>>>>>>>>>> - KStream<K,VOut> > >>>>>>>>>> KStream#processValues(ProcessorSupplier<K, > >>>>>>>>>>> V, K, > >>>>>>>>>>>>>>> VOut> > >>>>>>>>>>>>>>>> processorSupplier, Named named, String... > >>>>>>>>> stateStoreNames) > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Modified methods: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> - KStream<KOut,VOut> > >>>>> KStream#process(ProcessorSupplier<K, > >>>>>>>>>> V, > >>>>>>>>>>> KOut, > >>>>>>>>>>>>>>> VOut> > >>>>>>>>>>>>>>>> processorSupplier, String... stateStoreNames) > >>>>>>>>>>>>>>>> - KStream<KOut,VOut> > >>>>> KStream#process(ProcessorSupplier<K, > >>>>>>>>>> V, > >>>>>>>>>>> KOut, > >>>>>>>>>>>>>>> VOut> > >>>>>>>>>>>>>>>> processorSupplier, Named named, String... > >>>>>>>>> stateStoreNames) > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> ``` > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Not sure if I understand how this would look > >>>>> like. Do you > >>>>>>>>>>> mean > >>>>>>>>>>>>>>> checking > >>>>>>>>>>>>>>>>> it > >>>>>>>>>>>>>>>>>> on the Record itself or somewhere else? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> @Guozhang: I am not worried about the runtime > >>>>> overhead. I > >>>>>>>>> am > >>>>>>>>>>> worries > >>>>>>>>>>>>>>>>> about user experience. It's not clear from the > >>>>> method > >>>>>>>>>>> signature, that > >>>>>>>>>>>>>>>>> you are not allowed to change the key, what seems > >>>>> to be bad > >>>>>>>>>>> API desig. > >>>>>>>>>>>>>>>>> Even if I understand the desire to keep the API > >>>>> surface > >>>>>>>>> ares > >>>>>>>>>>> small -- I > >>>>>>>>>>>>>>>>> would rather have a compile time enforcement than > >>>>> a runtime > >>>>>>>>>>> check. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> For example, we have `map()` and `mapValues()` > >>>> and > >>>>>>>>>>> `mapValues()` returns > >>>>>>>>>>>>>>>>> a `Value V` (enforces that that key is not > >>>>> changes) instead > >>>>>>>>>> of > >>>>>>>>>>> a > >>>>>>>>>>>>>>>>> `KeyValue<KIn,VOut>` and we use a runtime check > >>>> to > >>>>> check > >>>>>>>>> that > >>>>>>>>>>> the key is > >>>>>>>>>>>>>>>>> not changed. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Naively, could we enforce something similar by > >>>>> setting the > >>>>>>>>>>> output key > >>>>>>>>>>>>>>>>> type as `Void`. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> KStream#processValue(ProcessorSupplier<K, V, > >>>>> Void, > >>>>>>>>> VOut> > >>>>>>>>>>>>>>>>> processorSupplier) > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Not sure if this would work or not? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Or it might be worth to add a new interface, > >>>>>>>>>>> `ValueProcessorSupplier` > >>>>>>>>>>>>>>>>> that ensures that the key is not modified? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> This is an important discussion, even more so with > >>>> a > >>>>> DSL > >>>>>>>>> v2.0. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> At the moment, the DSL just flags whether > >>>>> partitioning is > >>>>>>>>>>> required based > >>>>>>>>>>>>>>> on > >>>>>>>>>>>>>>>> the DSL operation. As mentioned, `mapValues()` > >>>>> enforces only > >>>>>>>>>> the > >>>>>>>>>>> value > >>>>>>>>>>>>>>> has > >>>>>>>>>>>>>>>> changed through the DSL, though the only > >>>> _guarantee_ > >>>>> we have > >>>>>>>>> is > >>>>>>>>>>> that > >>>>>>>>>>>>>>> Kafka > >>>>>>>>>>>>>>>> Streams "owns" the implementation, and we can flag > >>>>> this > >>>>>>>>>> properly. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> With a hypothetical v2.0 based on Record API, this > >>>>> will be > >>>>>>>>>>> harder to > >>>>>>>>>>>>>>>> enforce with the current APIs. e.g. with > >>>>> `mapValues(Record<K, > >>>>>>>>>> V> > >>>>>>>>>>>>>>> record)`, > >>>>>>>>>>>>>>>> nothing would stop users from using > >>>>>>>>>>>>>>> `record.withKey("needs_partitioning")`. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> The approach defined on this KIP is similar to what > >>>>> we have > >>>>>>>>> at > >>>>>>>>>>> the moment > >>>>>>>>>>>>>>>> on `ValueTransformer*` where it validates at > >>>> runtime > >>>>> that the > >>>>>>>>>>> users are > >>>>>>>>>>>>>>> not > >>>>>>>>>>>>>>>> calling `forward` with > >>>>> `ForwardingDisabledProcessorContext`. > >>>>>>>>>>>>>>>> `ValueProcessorSupplier` is not meant to be a > >>>> public > >>>>> API. > >>>>>>>>> Only > >>>>>>>>>>> to be used > >>>>>>>>>>>>>>>> internally on `processValues` implementation. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> At first, > >>>> `KStream#processValue(ProcessorSupplier<K, > >>>>> V, Void, > >>>>>>>>>>> VOut> > >>>>>>>>>>>>>>>> processorSupplier)` won't work as it will require > >>>> the > >>>>>>>>>> `Processor` > >>>>>>>>>>>>>>>> implementation to actually change the key. Will > >>>> take > >>>>> a deeper > >>>>>>>>>>> look to > >>>>>>>>>>>>>>>> validate if this could solve this issue. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> -Matthias > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> On 2/17/22 10:56 AM, Guozhang Wang wrote: > >>>>>>>>>>>>>>>>>> Regarding the last question Matthias had, I > >>>>> wonder if > >>>>>>>>> it's > >>>>>>>>>>> similar to > >>>>>>>>>>>>>>> my > >>>>>>>>>>>>>>>>>> first email's point 2) above? I think the > >>>>> rationale is > >>>>>>>>>> that, > >>>>>>>>>>> since > >>>>>>>>>>>>>>>>>> reference checks are relatively very cheap, it > >>>> is > >>>>>>>>>> worthwhile > >>>>>>>>>>> to pay > >>>>>>>>>>>>>>> this > >>>>>>>>>>>>>>>>>> extra runtime checks and in return to have a > >>>>> single > >>>>>>>>>>> consolidated > >>>>>>>>>>>>>>>>>> ProcessorSupplier programming interface (i.e. > >>>> we > >>>>> would > >>>>>>>>>>> eventually > >>>>>>>>>>>>>>>>>> deprecate ValueTransformerWithKeySupplier). > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> On Wed, Feb 16, 2022 at 10:57 AM Jorge Esteban > >>>>> Quilcate > >>>>>>>>>>> Otoya < > >>>>>>>>>>>>>>>>>> quilcate.jo...@gmail.com> wrote: > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Thank you Matthias, this is great feedback. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Adding my comments below. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> On Wed, 16 Feb 2022 at 00:42, Matthias J. > >>>> Sax < > >>>>>>>>>>> mj...@apache.org> > >>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Thanks for the KIP. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> In alignment to my reply to KIP-634, I am > >>>>> wondering > >>>>>>>>> if > >>>>>>>>>>> we are > >>>>>>>>>>>>>>> heading > >>>>>>>>>>>>>>>>>>>> into the right direction, or if we should > >>>>> consider to > >>>>>>>>>>> re-design the > >>>>>>>>>>>>>>> DSL > >>>>>>>>>>>>>>>>>>>> from scratch? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> I'm very excited about the idea of a DLS > >>>> v2.0. > >>>>> It > >>>>>>>>>> probably > >>>>>>>>>>> deserves > >>>>>>>>>>>>>>> its > >>>>>>>>>>>>>>>>> own > >>>>>>>>>>>>>>>>>>> thread to start discussing ideas. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> For this KIP specifically, I think about it > >>>> as > >>>>> a > >>>>>>>>>>> continuation from > >>>>>>>>>>>>>>>>> KIP-478. > >>>>>>>>>>>>>>>>>>> Therefore, it could make sense to have it as > >>>>> part of > >>>>>>>>> the > >>>>>>>>>>> current > >>>>>>>>>>>>>>>>> version of > >>>>>>>>>>>>>>>>>>> the DSL. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Even if we don't do a DSL 2.0 right now, I > >>>>> have some > >>>>>>>>>>> concerns about > >>>>>>>>>>>>>>>>> this > >>>>>>>>>>>>>>>>>>>> KIP: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> (1) I am not sure if the propose changed is > >>>>> backward > >>>>>>>>>>> compatible? We > >>>>>>>>>>>>>>>>>>>> currently have: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> void > >>>> KStream#process(ProcessorSupplier, > >>>>>>>>> String...) > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> The newly proposed method: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> KStream > >>>>> KStream#process(ProcessorSupplier) > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> seems to be an incompatible change? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> The KIP states: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> Modified method KStream#process should be > >>>>>>>>> compatible > >>>>>>>>>>> with previous > >>>>>>>>>>>>>>>>>>>> version, that at the moment is fixed to a > >>>>> Void return > >>>>>>>>>>> type. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Why is it backward compatible? Having both > >>>>> old and > >>>>>>>>> new > >>>>>>>>>>> #process() > >>>>>>>>>>>>>>> seems > >>>>>>>>>>>>>>>>>>>> not to be compatible to me? Or are you > >>>>> proposing to > >>>>>>>>>>> _change_ the > >>>>>>>>>>>>>>> method > >>>>>>>>>>>>>>>>>>>> signature (if yes, the `String...` > >>>> parameter > >>>>> to add a > >>>>>>>>>>> state store > >>>>>>>>>>>>>>> seems > >>>>>>>>>>>>>>>>>>>> to be missing)? For this case, it seems > >>>> that > >>>>> existing > >>>>>>>>>>> programs > >>>>>>>>>>>>>>> would at > >>>>>>>>>>>>>>>>>>>> least need to be recompiled -- it would > >>>> only > >>>>> be a > >>>>>>>>>> source > >>>>>>>>>>> compatible > >>>>>>>>>>>>>>>>>>>> change, but not a binary compatible change? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> You're right. I'm not proposing the method > >>>>> signature. > >>>>>>>>>>>>>>>>>>> Totally agree about compatibility issue. I > >>>> was > >>>>> only > >>>>>>>>>>> considering > >>>>>>>>>>>>>>> source > >>>>>>>>>>>>>>>>>>> compatibility and was ignorant that changing > >>>>> from void > >>>>>>>>> to > >>>>>>>>>>> a specific > >>>>>>>>>>>>>>>>> type > >>>>>>>>>>>>>>>>>>> would break binary compatibility. > >>>>>>>>>>>>>>>>>>> I will update the KIP to reflect this: > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Modifications to method KStream#process are > >>>>> source > >>>>>>>>>>> compatible with > >>>>>>>>>>>>>>>>>>> previous version, though not binary > >>>> compatible. > >>>>>>>>> Therefore > >>>>>>>>>>> will > >>>>>>>>>>>>>>> require > >>>>>>>>>>>>>>>>>>> users to recompile their applications with > >>>> the > >>>>> latest > >>>>>>>>>>> version. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> I am also wondering if/how this change > >>>>> related to > >>>>>>>>>>> KIP-401: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>> > >>>>> > >>>> > >> > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=97553756 > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> From a high level it might not > >>>> conflict, > >>>>> but I > >>>>>>>>>> wanted > >>>>>>>>>>> to double > >>>>>>>>>>>>>>>>> check? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Wasn't aware of this KIP, thanks for sharing! > >>>>> I don't > >>>>>>>>>>> think there is > >>>>>>>>>>>>>>>>>>> conflict between KIPs, as far as I > >>>> understand. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> For `KStream#processValues()`, my main > >>>>> concern is the > >>>>>>>>>>> added runtime > >>>>>>>>>>>>>>>>>>>> check if the key was modified or not -- it > >>>>> seems to > >>>>>>>>>>> provide bad user > >>>>>>>>>>>>>>>>>>>> experience -- enforcing that the key is not > >>>>> modified > >>>>>>>>> on > >>>>>>>>>>> an API > >>>>>>>>>>>>>>> level, > >>>>>>>>>>>>>>>>>>>> would seem to be much better. > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Last, what is the purpose of > >>>>> `setRecordKey()` and > >>>>>>>>>>>>>>> `clearRecordKey()`? I > >>>>>>>>>>>>>>>>>>>> am not sure if I understand their purpose? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Both methods set/clear the context (current > >>>>> key) to be > >>>>>>>>>>> used when > >>>>>>>>>>>>>>>>> checking > >>>>>>>>>>>>>>>>>>> keys on forward(record) implementation. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> enforcing that the key is not modified on > >>>> an > >>>>> API > >>>>>>>>> level, > >>>>>>>>>>> would seem > >>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>> be > >>>>>>>>>>>>>>>>>>> much better. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Not sure if I understand how this would look > >>>>> like. Do > >>>>>>>>> you > >>>>>>>>>>> mean > >>>>>>>>>>>>>>> checking > >>>>>>>>>>>>>>>>> it > >>>>>>>>>>>>>>>>>>> on the Record itself or somewhere else? > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> -Matthias > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> On 2/15/22 11:53 AM, John Roesler wrote: > >>>>>>>>>>>>>>>>>>>>> My apologies, this feedback was intended > >>>>> for > >>>>>>>>> KIP-634. > >>>>>>>>>>>>>>>>>>>>> -John > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> On Tue, Feb 15, 2022, at 13:15, John > >>>>> Roesler wrote: > >>>>>>>>>>>>>>>>>>>>>> Thanks for the update, Jorge, > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> I've just looked over the KIP again. > >>>>> Just one > >>>>>>>>> more > >>>>>>>>>>> small > >>>>>>>>>>>>>>>>>>>>>> concern: > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> 5) We can't just change the type of > >>>>>>>>>> Record#headers() > >>>>>>>>>>> to a > >>>>>>>>>>>>>>>>>>>>>> new fully qualified type. That would be > >>>>> a source- > >>>>>>>>>>>>>>>>>>>>>> incompatible breaking change for users. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Out options are: > >>>>>>>>>>>>>>>>>>>>>> * Deprecate the existing method and > >>>>> create a new > >>>>>>>>>> one > >>>>>>>>>>> with > >>>>>>>>>>>>>>>>>>>>>> the new type > >>>>>>>>>>>>>>>>>>>>>> * If the existing Headers is "not great > >>>>> but ok", > >>>>>>>>>>> then maybe > >>>>>>>>>>>>>>>>>>>>>> we leave it alone. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>>>>>> -John > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> On Mon, 2022-02-14 at 13:58 -0600, Paul > >>>>> Whalen > >>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>> No specific comments, but I just > >>>>> wanted to > >>>>>>>>>> mention > >>>>>>>>>>> I like the > >>>>>>>>>>>>>>>>>>>> direction of > >>>>>>>>>>>>>>>>>>>>>>> the KIP. My team is a big user of > >>>>> "transform" > >>>>>>>>>>> methods because of > >>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>> ability to chain them, and I have > >>>>> always found > >>>>>>>>>> the > >>>>>>>>>>> terminology > >>>>>>>>>>>>>>>>>>>> challenging > >>>>>>>>>>>>>>>>>>>>>>> to explain alongside "process". It > >>>>> felt like > >>>>>>>>> one > >>>>>>>>>>> concept with > >>>>>>>>>>>>>>> two > >>>>>>>>>>>>>>>>>>>> names. > >>>>>>>>>>>>>>>>>>>>>>> So moving towards a single API that > >>>> is > >>>>> powerful > >>>>>>>>>>> enough to handle > >>>>>>>>>>>>>>>>> both > >>>>>>>>>>>>>>>>>>>> use > >>>>>>>>>>>>>>>>>>>>>>> cases seems absolutely correct to me. > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Paul > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> On Mon, Feb 14, 2022 at 1:12 PM Jorge > >>>>> Esteban > >>>>>>>>>>> Quilcate Otoya < > >>>>>>>>>>>>>>>>>>>>>>> quilcate.jo...@gmail.com> wrote: > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> Got it. Thanks John, this make > >>>> sense. > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> I've updated the KIP to include the > >>>>>>>>> deprecation > >>>>>>>>>>> of: > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> - KStream#transform > >>>>>>>>>>>>>>>>>>>>>>>> - KStream#transformValues > >>>>>>>>>>>>>>>>>>>>>>>> - KStream#flatTransform > >>>>>>>>>>>>>>>>>>>>>>>> - > >>>> KStream#flatTransformValues > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> On Fri, 11 Feb 2022 at 15:16, John > >>>>> Roesler < > >>>>>>>>>>> vvcep...@apache.org > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> Thanks, Jorge! > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> I think it’ll be better to keep > >>>>> this KIP > >>>>>>>>>>> focused on KStream > >>>>>>>>>>>>>>>>> methods > >>>>>>>>>>>>>>>>>>>> only. > >>>>>>>>>>>>>>>>>>>>>>>>> I suspect that the KTable methods > >>>>> may be > >>>>>>>>> more > >>>>>>>>>>> complicated than > >>>>>>>>>>>>>>>>> just > >>>>>>>>>>>>>>>>>>>> that > >>>>>>>>>>>>>>>>>>>>>>>>> proposed replacement, but it’ll > >>>>> also be > >>>>>>>>>> easier > >>>>>>>>>>> to consider that > >>>>>>>>>>>>>>>>>>>> question > >>>>>>>>>>>>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>>>>>>>>> isolation. > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> The nice thing about just > >>>>> deprecating the > >>>>>>>>>>> KStream methods and > >>>>>>>>>>>>>>> not > >>>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>> Transform* interfaces is that you > >>>>> can keep > >>>>>>>>>>> your proposal just > >>>>>>>>>>>>>>>>>>> scoped > >>>>>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>>>>>>>>> KStream and not have any > >>>>> consequences for > >>>>>>>>> the > >>>>>>>>>>> rest of the DSL. > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> Thanks again, > >>>>>>>>>>>>>>>>>>>>>>>>> John > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Feb 11, 2022, at 06:43, > >>>>> Jorge > >>>>>>>>> Esteban > >>>>>>>>>>> Quilcate Otoya > >>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, John. > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> 4) I agree that we shouldn't > >>>>> deprecate > >>>>>>>>>> the > >>>>>>>>>>> Transformer* > >>>>>>>>>>>>>>>>>>>>>>>>>> classes, but do you think we > >>>>> should > >>>>>>>>>>> deprecate the > >>>>>>>>>>>>>>>>>>>>>>>>>> KStream#transform* methods? I'm > >>>>> curious > >>>>>>>>> if > >>>>>>>>>>> there's any > >>>>>>>>>>>>>>>>>>>>>>>>>> remaining reason to have those > >>>>> methods, > >>>>>>>>> or > >>>>>>>>>>> if your KIP > >>>>>>>>>>>>>>>>>>>>>>>>>> completely obviates them. > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>> Good catch. > >>>>>>>>>>>>>>>>>>>>>>>>>> I considered that deprecating > >>>>>>>>>> `Transformer*` > >>>>>>>>>>> and `transform*` > >>>>>>>>>>>>>>>>>>> would > >>>>>>>>>>>>>>>>>>>> go > >>>>>>>>>>>>>>>>>>>>>>>>> hand > >>>>>>>>>>>>>>>>>>>>>>>>>> in hand — maybe it happened > >>>>> similarly > >>>>>>>>> with > >>>>>>>>>>> old `Processor` and > >>>>>>>>>>>>>>>>>>>>>>>> `process`? > >>>>>>>>>>>>>>>>>>>>>>>>>> Though deprecating only > >>>>> `transform*` > >>>>>>>>>>> operations could be a > >>>>>>>>>>>>>>> better > >>>>>>>>>>>>>>>>>>>>>>>> signal > >>>>>>>>>>>>>>>>>>>>>>>>>> for users than non deprecating > >>>>> anything > >>>>>>>>> at > >>>>>>>>>>> all and pave the > >>>>>>>>>>>>>>> way > >>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>>>> it's > >>>>>>>>>>>>>>>>>>>>>>>>>> deprecation. > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>> Should this deprecation also > >>>>> consider > >>>>>>>>>>> including > >>>>>>>>>>>>>>>>>>>>>>>> `KTable#transformValues`? > >>>>>>>>>>>>>>>>>>>>>>>>>> The approach proposed on the > >>>> KIP: > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>> `ktable.toStream().processValues().toTable()` seems fair to > >>>>>>>>>>>>>>> me, > >>>>>>>>>>>>>>>>>>>> though > >>>>>>>>>>>>>>>>>>>>>>>> I > >>>>>>>>>>>>>>>>>>>>>>>>>> will have to test it further. > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>> I'm happy to update the KIP if > >>>>> there's > >>>>>>>>> some > >>>>>>>>>>> consensus around > >>>>>>>>>>>>>>>>> this. > >>>>>>>>>>>>>>>>>>>>>>>>>> Will add the deprecation notes > >>>>> these days > >>>>>>>>>>> and wait for any > >>>>>>>>>>>>>>>>>>>> additional > >>>>>>>>>>>>>>>>>>>>>>>>>> feedback on this topic before > >>>>> wrapping up > >>>>>>>>>>> the KIP. > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, 11 Feb 2022 at 04:03, > >>>>> John > >>>>>>>>> Roesler > >>>>>>>>>> < > >>>>>>>>>>>>>>> vvcep...@apache.org> > >>>>>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the update, Jorge! > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> I just read over the KIP > >>>>> again, and I'm > >>>>>>>>>> in > >>>>>>>>>>> support. One more > >>>>>>>>>>>>>>>>>>>>>>>>>>> question came up for me, > >>>>> though: > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> 4) I agree that we shouldn't > >>>>> deprecate > >>>>>>>>>> the > >>>>>>>>>>> Transformer* > >>>>>>>>>>>>>>>>>>>>>>>>>>> classes, but do you think we > >>>>> should > >>>>>>>>>>> deprecate the > >>>>>>>>>>>>>>>>>>>>>>>>>>> KStream#transform* methods? > >>>>> I'm curious > >>>>>>>>>> if > >>>>>>>>>>> there's any > >>>>>>>>>>>>>>>>>>>>>>>>>>> remaining reason to have > >>>> those > >>>>> methods, > >>>>>>>>>> or > >>>>>>>>>>> if your KIP > >>>>>>>>>>>>>>>>>>>>>>>>>>> completely obviates them. > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>>>>>>>>>>> -John > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, 2022-02-10 at 21:32 > >>>>> +0000, > >>>>>>>>> Jorge > >>>>>>>>>>> Esteban Quilcate > >>>>>>>>>>>>>>>>>>>>>>>>>>> Otoya wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Thank you both for your > >>>>> feedback! > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> I have added the following > >>>>> note on > >>>>>>>>>>> punctuation: > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> ``` > >>>>>>>>>>>>>>>>>>>>>>>>>>>> NOTE: The key validation > >>>> can > >>>>> be > >>>>>>>>> defined > >>>>>>>>>>> when processing the > >>>>>>>>>>>>>>>>>>>> message. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Though, with punctuations > >>>> it > >>>>> won't be > >>>>>>>>>>> possible to define the > >>>>>>>>>>>>>>>>> key > >>>>>>>>>>>>>>>>>>>> for > >>>>>>>>>>>>>>>>>>>>>>>>>>>> validation before > >>>> forwarding, > >>>>>>>>> therefore > >>>>>>>>>>> it won't be > >>>>>>>>>>>>>>> possible to > >>>>>>>>>>>>>>>>>>>>>>>>> forward > >>>>>>>>>>>>>>>>>>>>>>>>>>>> from punctuation. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> This is similar behavior to > >>>>> how > >>>>>>>>>>> `ValueTransformer`s behave > >>>>>>>>>>>>>>> at > >>>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>> moment. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> ``` > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Also make it explicit also > >>>>> that we > >>>>>>>>> are > >>>>>>>>>>> going to apply > >>>>>>>>>>>>>>>>>>> referencial > >>>>>>>>>>>>>>>>>>>>>>>>>>> equality > >>>>>>>>>>>>>>>>>>>>>>>>>>>> for key validation. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> I hope this is covering all > >>>>> your > >>>>>>>>>>> feedback, let me know if > >>>>>>>>>>>>>>> I'm > >>>>>>>>>>>>>>>>>>>>>>>> missing > >>>>>>>>>>>>>>>>>>>>>>>>>>>> anything. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers, > >>>>>>>>>>>>>>>>>>>>>>>>>>>> Jorge. > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, 9 Feb 2022 at > >>>> 22:19, > >>>>> Guozhang > >>>>>>>>>>> Wang < > >>>>>>>>>>>>>>> wangg...@gmail.com > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm +1 on John's point 3) > >>>>> for > >>>>>>>>>>> punctuations. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> And I think if people are > >>>>> on the > >>>>>>>>> same > >>>>>>>>>>> page that a reference > >>>>>>>>>>>>>>>>>>>>>>>> equality > >>>>>>>>>>>>>>>>>>>>>>>>>>> check > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> per record is not a huge > >>>>> overhead, > >>>>>>>>> I > >>>>>>>>>>> think doing that > >>>>>>>>>>>>>>>>>>> enforcement > >>>>>>>>>>>>>>>>>>>>>>>> is > >>>>>>>>>>>>>>>>>>>>>>>>>>> better > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> than documentations and > >>>>> hand-wavy > >>>>>>>>>>> undefined behaviors. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Feb 9, 2022 at > >>>>> 11:27 AM > >>>>>>>>> John > >>>>>>>>>>> Roesler < > >>>>>>>>>>>>>>>>>>>> vvcep...@apache.org > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP > >>>> Jorge, > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm in support of your > >>>>> proposal. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1) > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I do agree with > >>>>> Guozhang's point > >>>>>>>>>>> (1). I think the cleanest > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> approach. I think it's > >>>>> cleaner > >>>>>>>>> and > >>>>>>>>>>> better to keep the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enforcement internal to > >>>>> the > >>>>>>>>>>> framework than to introduce a > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public API or context > >>>>> wrapper for > >>>>>>>>>>> processors to use > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> explicitly. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2) I tend to agree with > >>>>> you on > >>>>>>>>> this > >>>>>>>>>>> one; I think the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> equality check ought to > >>>>> be fast > >>>>>>>>>>> enough in practice. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3) I think this is > >>>>> implicit, but > >>>>>>>>>>> should be explicit in the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP: For the > >>>>> `processValues` API, > >>>>>>>>>>> because the framework > >>>>>>>>>>>>>>> sets > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the key on the context > >>>>> before > >>>>>>>>>>> calling `process` and then > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> unsets it afterwards, > >>>>> there will > >>>>>>>>>>> always be no key set > >>>>>>>>>>>>>>> during > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> task puctuation. > >>>>> Therefore, while > >>>>>>>>>>> processors may still > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> register punctuators, > >>>>> they will > >>>>>>>>> not > >>>>>>>>>>> be able to forward > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> anything from them. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is functionally > >>>>> equivalent > >>>>>>>>> to > >>>>>>>>>>> the existing > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> transformers, by the > >>>>> way, that > >>>>>>>>> are > >>>>>>>>>>> also forbidden to > >>>>>>>>>>>>>>> forward > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> anything during > >>>>> punctuation. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For what it's worth, I > >>>>> think this > >>>>>>>>>> is > >>>>>>>>>>> the best tradeoff. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The only alternative I > >>>>> see is not > >>>>>>>>>> to > >>>>>>>>>>> place any restriction > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> on forwarded keys at > >>>> all > >>>>> and just > >>>>>>>>>>> document that if users > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> don't maintain proper > >>>>>>>>> partitioning, > >>>>>>>>>>> they'll get undefined > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> behavior. That might be > >>>>> more > >>>>>>>>>>> powerful, but it's also a > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> usability problem. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -John > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, 2022-02-09 at > >>>>> 11:34 > >>>>>>>>> +0000, > >>>>>>>>>>> Jorge Esteban Quilcate > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Otoya wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Guozhang. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Does > >>>>> `ValueProcessorContext` > >>>>>>>>>>> have to be a public API? It > >>>>>>>>>>>>>>>>>>>>>>>> seems > >>>>>>>>>>>>>>>>>>>>>>>>>>> to me > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that this can be > >>>>> completely > >>>>>>>>>>> abstracted away from user > >>>>>>>>>>>>>>>>>>>>>>>> interfaces > >>>>>>>>>>>>>>>>>>>>>>>>>>> as an > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> internal class > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Totally agree. No > >>>>> intention to > >>>>>>>>>> add > >>>>>>>>>>> these as public APIs. > >>>>>>>>>>>>>>>>> Will > >>>>>>>>>>>>>>>>>>>>>>>>>>> update > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> KIP to reflect this. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in the past the > >>>>> rationale for > >>>>>>>>>>> enforcing it at the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> interface layer > >>>> rather > >>>>> than do > >>>>>>>>>>> runtime checks is that it > >>>>>>>>>>>>>>> is > >>>>>>>>>>>>>>>>>>>>>>>> more > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> efficient. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm not sure how > >>>> much > >>>>>>>>> overhead > >>>>>>>>>>> it may incur to check if > >>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>> key > >>>>>>>>>>>>>>>>>>>>>>>>>>> did > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> change: if it is > >>>> just a > >>>>>>>>> reference > >>>>>>>>>>> equality check maybe > >>>>>>>>>>>>>>> it's > >>>>>>>>>>>>>>>>>>>>>>>>> okay. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> What's > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> your take on this? > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Agree, reference > >>>>> equality > >>>>>>>>> should > >>>>>>>>>>> cover this validation > >>>>>>>>>>>>>>> and > >>>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>>>> overhead > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> impact should not be > >>>>>>>>> meaningful. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Will update the KIP > >>>> to > >>>>> reflect > >>>>>>>>>>> this as well. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, 8 Feb 2022 at > >>>>> 19:05, > >>>>>>>>>>> Guozhang Wang < > >>>>>>>>>>>>>>>>>>>>>>>> wangg...@gmail.com> > >>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hello Jorge, > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for bringing > >>>>> this > >>>>>>>>> KIP! I > >>>>>>>>>>> think this is a nice > >>>>>>>>>>>>>>> idea > >>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>>>>>>>>>>> consider > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> using > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a single overloaded > >>>>> function > >>>>>>>>>>> name for #process, just a > >>>>>>>>>>>>>>>>>>>>>>>> couple > >>>>>>>>>>>>>>>>>>>>>>>>>>> quick > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> questions after > >>>>> reading the > >>>>>>>>>>> proposal: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1) Does > >>>>>>>>> `ValueProcessorContext` > >>>>>>>>>>> have to be a public > >>>>>>>>>>>>>>> API? It > >>>>>>>>>>>>>>>>>>>>>>>>>>> seems to > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> me > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that this can be > >>>>> completely > >>>>>>>>>>> abstracted away from user > >>>>>>>>>>>>>>>>>>>>>>>>> interfaces > >>>>>>>>>>>>>>>>>>>>>>>>>>> as > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> an > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> internal class, and > >>>>> we call > >>>>>>>>> the > >>>>>>>>>>> `setKey` before calling > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> user-instantiated > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `process` function, > >>>>> and then > >>>>>>>>> in > >>>>>>>>>>> its overridden > >>>>>>>>>>>>>>> `forward` it > >>>>>>>>>>>>>>>>>>>>>>>>> can > >>>>>>>>>>>>>>>>>>>>>>>>>>> just > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> check > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if the key changes > >>>>> or not. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2) Related to 1) > >>>>> above, in > >>>>>>>>> the > >>>>>>>>>>> past the rationale for > >>>>>>>>>>>>>>>>>>>>>>>>> enforcing > >>>>>>>>>>>>>>>>>>>>>>>>>>> it at > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> interface layer > >>>>> rather than > >>>>>>>>> do > >>>>>>>>>>> runtime checks is that > >>>>>>>>>>>>>>> it is > >>>>>>>>>>>>>>>>>>>>>>>>> more > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> efficient. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'm not sure how > >>>> much > >>>>>>>>> overhead > >>>>>>>>>>> it may incur to check if > >>>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>>>>>>>>>> key > >>>>>>>>>>>>>>>>>>>>>>>>>>> did > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> not > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> change: if it is > >>>>> just a > >>>>>>>>>>> reference equality check maybe > >>>>>>>>>>>>>>> it's > >>>>>>>>>>>>>>>>>>>>>>>>> okay. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> What's > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> your take on this? > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Feb 8, 2022 > >>>>> at 5:17 > >>>>>>>>> AM > >>>>>>>>>>> Jorge Esteban Quilcate > >>>>>>>>>>>>>>> Otoya > >>>>>>>>>>>>>>>>>>>>>>>> < > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>> quilcate.jo...@gmail.com> > >>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Dev team, > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'd like to start > >>>>> a new > >>>>>>>>>>> discussion thread on Kafka > >>>>>>>>>>>>>>> Streams > >>>>>>>>>>>>>>>>>>>>>>>>>>> KIP-820: > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>> > >>>>> > >>>> > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-820%3A+Extend+KStream+process+with+new+Processor+API > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This KIP is aimed > >>>>> to extend > >>>>>>>>>>> the current > >>>>>>>>>>>>>>> `KStream#process` > >>>>>>>>>>>>>>>>>>>>>>>>> API > >>>>>>>>>>>>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> return > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> output values > >>>> that > >>>>> could be > >>>>>>>>>>> chained across the > >>>>>>>>>>>>>>> topology, > >>>>>>>>>>>>>>>>>>>>>>>> as > >>>>>>>>>>>>>>>>>>>>>>>>>>> well as > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> introducing a new > >>>>>>>>>>> `KStream#processValues` to use > >>>>>>>>>>>>>>> processor > >>>>>>>>>>>>>>>>>>>>>>>>>>> while > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> validating > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> keys haven't > >>>>> change and > >>>>>>>>>>> repartition is not required. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Looking forward > >>>> to > >>>>> your > >>>>>>>>>>> feedback. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regards, > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jorge. > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Guozhang > >>>>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> -- > >>>>>>>>> -- Guozhang > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>> > >>>>> > >>>> > >>> > >>> > >> > > >