Hi Florian, I've made a pass over the PR. There are some comments that are related to the function names which may be affecting the KIP wiki page, but overall I think it looks good already.
Guozhang On Fri, Nov 16, 2018 at 4:21 PM Guozhang Wang <wangg...@gmail.com> wrote: > Thanks Florian! I will take a look at the PR. > > > > On Mon, Nov 12, 2018 at 2:44 PM Florian Hussonnois <fhussonn...@gmail.com> > wrote: > >> Hi Matthias, >> >> Sorry I was absent for a while. I have started a new PR for this KIP. It >> is >> still in progress for now. I'm working on it. >> https://github.com/apache/kafka/pull/5909 >> >> Le ven. 19 oct. 2018 à 20:13, Matthias J. Sax <matth...@confluent.io> a >> écrit : >> >> > What is the status of this KIP? >> > >> > -Matthias >> > >> > On 7/19/18 5:17 PM, Guozhang Wang wrote: >> > > Hello Florian, >> > > >> > > Sorry for being late... Found myself keep apologizing for late replies >> > > these days. But I do want to push this KIP's progress forward as I >> see it >> > > very important and helpful feature for extensibility. >> > > >> > > About the exceptions, I've gone through them and hopefully it is an >> > > exhaustive list: >> > > >> > > 1. KTable#toStream() >> > > 2. KStream#merge(KStream) >> > > 3. KStream#process() / transform() / transformValues() >> > > 4. KGroupedTable / KGroupedStream#count() >> > > >> > > >> > > Here's my reasoning: >> > > >> > > * It is okay not letting users to override the name for 1/2, since >> they >> > are >> > > too trivial to be useful for debugging, plus their processor names >> would >> > > not determine any related topic / store names. >> > > * For 3, I'd vote for adding overloaded functions with Named. >> > > * For 4, if users really want to name the processor she can call >> > > aggregate() instead, so I think it is okay to skip this case. >> > > >> > > >> > > Guozhang >> > > >> > > >> > > >> > > On Fri, Jul 6, 2018 at 3:06 PM, Florian Hussonnois < >> > fhussonn...@gmail.com> >> > > wrote: >> > > >> > >> Hi, >> > >> >> > >> The option #3 seems to be a good alternative and I find the API more >> > >> elegant (thanks John). >> > >> >> > >> But, we still have the need to overload some methods either because >> > they do >> > >> not accept an action instance or because they are translated to >> multiple >> > >> processors. >> > >> >> > >> For example, this is the case for methods branch() and merge(). We >> could >> > >> introduce a new interface Named (or maybe a different name ?) with a >> > method >> > >> name(). All action interfaces could extend this one to implement the >> > option >> > >> 3). >> > >> This would result by having the following overloads : >> > >> >> > >> Stream<K, V> merge(final Named name, final KStream<K, V> stream); >> > >> KStream<K, V>[] branch(final Named name, final Predicate<? super K, ? >> > super >> > >> V>... predicates) >> > >> >> > >> N.B : The list above is not exhaustive >> > >> >> > >> --------- >> > >> user's code will become : >> > >> >> > >> KStream<String, Integer> stream = builder.stream("test"); >> > >> KStream<String, Integer>[] branches = >> > >> stream.branch(Named.with("BRANCH-STREAM-ON-VALUE"), >> > >> Predicate.named("STREAM-PAIR-VALUE", (k, v) -> v % 2 >> == >> > >> 0), >> > >> Predicate.named("STREAM-IMPAIR-VALUE", (k, v) -> v % >> 2 >> > != >> > >> 0)); >> > >> >> > >> branches[0].to("pair"); >> > >> branches[1].to("impair"); >> > >> --------- >> > >> >> > >> This is a mix of the options 3) and 1) >> > >> >> > >> Le ven. 6 juil. 2018 à 22:58, Guozhang Wang <wangg...@gmail.com> a >> > écrit : >> > >> >> > >>> Hi folks, just to summarize the options we have so far: >> > >>> >> > >>> 1) Add a new "as" for KTable / KStream, plus adding new fields for >> > >>> operators-returns-void control objects (the current wiki's >> proposal). >> > >>> >> > >>> Pros: no more overloads. >> > >>> Cons: a bit departing with the current high-level API design of the >> > DSL, >> > >>> plus, the inconsistency between operators-returns-void and >> > >>> operators-not-return-voids. >> > >>> >> > >>> 2) Add overloaded functions for all operators, that accepts a new >> > control >> > >>> object "Described". >> > >>> >> > >>> Pros: consistent with current APIs. >> > >>> Cons: lots of overloaded functions to add. >> > >>> >> > >>> 3) Add another default function in the interface (thank you J8!) as >> > John >> > >>> proposed. >> > >>> >> > >>> Pros: no overloaded functions, no "Described". >> > >>> Cons: do we lose lambda functions really (seems not if we provide a >> > >> "named" >> > >>> for each func)? Plus "Described" may be more extensible than a >> single >> > >>> `String`. >> > >>> >> > >>> >> > >>> My principle of considering which one is better depends primarily on >> > "how >> > >>> to make advanced users easily use the additional API, while keeping >> it >> > >>> hidden from normal users who do not care at all". For that purpose I >> > >> think >> > >>> 3) > 1) > 2). >> > >>> >> > >>> One caveat though, is that changing the interface would not be >> > >>> binary-compatible though source-compatible, right? I.e. users need >> to >> > >>> recompile their code though no changes needed. >> > >>> >> > >>> >> > >>> >> > >>> Another note: for 3), if we really want to keep extensibility of >> > >> Described >> > >>> we could do sth. like: >> > >>> >> > >>> --------- >> > >>> >> > >>> public interface Predicate<K, V> { >> > >>> // existing method >> > >>> boolean test(final K key, final V value); >> > >>> >> > >>> // new default method adds the ability to name the predicate >> > >>> default Described described() { >> > >>> return new Described(null); >> > >>> } >> > >>> } >> > >>> >> > >>> ---------- >> > >>> >> > >>> where user's code becomes: >> > >>> >> > >>> stream.filter(named("key", (k, v) -> true)); // note `named` now >> just >> > >>> sets a Described("key") in "described()". >> > >>> >> > >>> stream.filter(described(Described.as("key", /* any other fancy >> > >> parameters >> > >>> in the future*/), (k, v) -> true)); >> > >>> ---------- >> > >>> >> > >>> >> > >>> I feel it is not much likely that we'd need to extend it further in >> the >> > >>> future, so just a `String` would be good enough. But just listing >> all >> > >>> possibilities here. >> > >>> >> > >>> >> > >>> >> > >>> Guozhang >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > >>> On Fri, Jul 6, 2018 at 8:19 AM, John Roesler <j...@confluent.io> >> > wrote: >> > >>> >> > >>>> Hi Florian, >> > >>>> >> > >>>> Sorry I'm late to the party, but I missed the message originally. >> > >>>> >> > >>>> Regarding the names, it's probably a good idea to stick to the same >> > >>>> character set we're currently using: letters, numbers, and hyphens. >> > The >> > >>>> names are used in Kafka topics, files and folders, and RocksDB >> > >> databases, >> > >>>> and we also need them to work with the file systems of Windows, >> Linux, >> > >>> and >> > >>>> MacOS. My opinion is that with a situation like that, it's better >> to >> > be >> > >>>> conservative. It might also be a good idea to impose an upper >> limit on >> > >>> name >> > >>>> length to avoid running afoul of any of those systems. >> > >>>> >> > >>>> --- >> > >>>> >> > >>>> It seems like there's a small debate between 1) adding a new >> method to >> > >>>> KStream (and maybe KTable) to modify its name after the fact, or 2) >> > >>>> piggy-backing on the config objects where they exist and adding one >> > >> where >> > >>>> they don't. To me, #2 is the better alternative even though it >> > produces >> > >>>> more overloads and may be a bit awkward in places. >> > >>>> >> > >>>> The reason is simply that #1 is a high-level departure from the >> > >>>> graph-building paradigm we're using in the DSL. Consider: >> > >>>> >> > >>>> Graph.node1(config).node2(config) >> > >>>> >> > >>>> vs >> > >>>> >> > >>>> Graph.node1().config().node2().config() >> > >>>> >> > >>>> We could have done either, but we picked the former. I think it's >> > >>> probably >> > >>>> a good goal to try and stick to it so that developers can develop >> and >> > >>> rely >> > >>>> on their instincts for how the DSL will behave. >> > >>>> >> > >>>> I do want to present one alternative to adding new config objects: >> we >> > >> can >> > >>>> just add a "name()" method to all our "action" interfaces. For >> > example, >> > >>>> I'll demonstrate how we can add a "name" to Predicate and then use >> it >> > >> to >> > >>>> name a "KStream#filter" DSL operator: >> > >>>> >> > >>>> public interface Predicate<K, V> { >> > >>>> // existing method >> > >>>> boolean test(final K key, final V value); >> > >>>> >> > >>>> // new default method adds the ability to name the predicate >> > >>>> default String name() { >> > >>>> return null; >> > >>>> } >> > >>>> >> > >>>> // new static factory method adds the ability to wrap lambda >> > >>> predicates >> > >>>> with a named predicate >> > >>>> static <K, V> Predicate<K, V> named(final String name, final >> > >>>> Predicate<K, V> predicate) { >> > >>>> return new Predicate<K, V>() { >> > >>>> @Override >> > >>>> public boolean test(final K key, final V value) { >> > >>>> return predicate.test(key, value); >> > >>>> } >> > >>>> >> > >>>> @Override >> > >>>> public String name() { >> > >>>> return name; >> > >>>> } >> > >>>> }; >> > >>>> } >> > >>>> } >> > >>>> >> > >>>> Then, here's how it would look to use it: >> > >>>> >> > >>>> // Anonymous predicates continue to work just fine >> > >>>> stream.filter((k, v) -> true); >> > >>>> >> > >>>> // Devs can swap in a Predicate that implements the name() method. >> > >>>> stream.filter(new Predicate<Object, Object>() { >> > >>>> @Override >> > >>>> public boolean test(final Object key, final Object value) { >> > >>>> return true; >> > >>>> } >> > >>>> >> > >>>> @Override >> > >>>> public String name() { >> > >>>> return "hey"; >> > >>>> } >> > >>>> }); >> > >>>> >> > >>>> // Or they can wrap their existing lambda using the static factory >> > >> method >> > >>>> stream.filter(named("key", (k, v) -> true)); >> > >>>> >> > >>>> Just a thought. >> > >>>> >> > >>>> Overall, I think it's really valuable to be able to name the >> > >> processors, >> > >>>> for all the reasons you mentioned in the KIP. So thank you for >> > >>> introducing >> > >>>> this! >> > >>>> >> > >>>> Thanks, >> > >>>> -John >> > >>>> >> > >>>> On Thu, Jul 5, 2018 at 4:53 PM Florian Hussonnois < >> > >> fhussonn...@gmail.com >> > >>>> >> > >>>> wrote: >> > >>>> >> > >>>>> Hi, thank you very much for all you suggestions. I've started to >> > >> update >> > >>>> the >> > >>>>> KIP ( >> > >>>>> >> > >>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- >> > >>>> 307%3A+Allow+to+define+custom+processor+names+with+KStreams+DSL >> > >>>>> ). >> > >>>>> Also, I propose to rename the Processed class into Described - >> this >> > >>> will >> > >>>> be >> > >>>>> more meaningful (but this is just a detail). >> > >>>>> >> > >>>>> I'm OK to not enforcing uppercase for specific names but should we >> > >>> allow >> > >>>>> arbitrary names with whitespaces for example ? Currently, I can't >> > >> tell >> > >>> if >> > >>>>> this can lead to some side effects ? >> > >>>>> >> > >>>>> Le lun. 11 juin 2018 à 01:31, Matthias J. Sax < >> matth...@confluent.io >> > >>> >> > >>> a >> > >>>>> écrit : >> > >>>>> >> > >>>>>> Just catching up on this thread. >> > >>>>>> >> > >>>>>> I like the general idea. Couple of comments: >> > >>>>>> >> > >>>>>> - I think that adding `Processed` (or maybe a different name?) >> is >> > >> a >> > >>>>>> valid proposal for stateless operators that only have a single >> > >>> overload >> > >>>>>> atm. It would align with the overall API design. >> > >>>>>> >> > >>>>>> - for all methods with multiple existing overloads, we can >> > >> consider >> > >>> to >> > >>>>>> extend `Consumed`, `Produced`, `Materialized` etc to take an >> > >>> additional >> > >>>>>> processor name (not sure atm how elegant this is; we would need >> to >> > >>>>>> "play" with the API a little bit; the advantage would be, that we >> > >> do >> > >>>> not >> > >>>>>> add more overloads what seems to be key for this KIP) >> > >>>>>> >> > >>>>>> - operators return void: while I agree that the "name first" >> > >>> chaining >> > >>>>>> idea is not very intuitive, it might still work, if we name the >> > >>> method >> > >>>>>> correctly (again, we would need to "play" with the API a little >> bit >> > >>> to >> > >>>>> see) >> > >>>>>> >> > >>>>>> - for DSL operators that are translated to multiple nodes: it >> > >> might >> > >>>>>> make sense to use the specified operator name as prefix and add >> > >>>>>> reasonable suffixes. For example, a join translates into 5 >> > >> operators >> > >>>>>> that could be name "name-left-store-processor", >> > >>>>>> "name-left-join-processor", "name-right-store-processor", >> > >>>>>> "name-right-join-processor", and "name-join-merge-processor" (or >> > >>>>>> similar). Maybe just using numbers might also work. >> > >>>>>> >> > >>>>>> - I think, we should strip the number suffixes if a user >> provides >> > >>>> names >> > >>>>>> >> > >>>>>> - enforcing upper case seems to be tricky: for example, we do >> not >> > >>>>>> enforce upper case for store names and we cannot easily change it >> > >> as >> > >>> it >> > >>>>>> would break compatibility -- thus, for consistency reasons we >> might >> > >>> not >> > >>>>>> want to do this >> > >>>>>> >> > >>>>>> - for better understand of the impact of the KIP, it would be >> > >> quite >> > >>>>>> helpful if you would list all method names that are affected in >> the >> > >>> KIP >> > >>>>>> (ie, list all newly added overloads) >> > >>>>>> >> > >>>>>> >> > >>>>>> -Matthias >> > >>>>>> >> > >>>>>> >> > >>>>>> On 5/31/18 6:40 PM, Guozhang Wang wrote: >> > >>>>>>> Hi Florian, >> > >>>>>>> >> > >>>>>>> Re 1: I think changing the KStreamImpl / KTableImpl to allow >> > >>>> modifying >> > >>>>>> the >> > >>>>>>> processor name after the operator is fine as long as we do the >> > >>> check >> > >>>>>> again >> > >>>>>>> when modifying that. In fact, we are having some topology >> > >>>> optimization >> > >>>>>>> going on which may modify processor names in the final topology >> > >>>>> anyways ( >> > >>>>>>> https://github.com/apache/kafka/pull/4983). Semantically I >> think >> > >>> it >> > >>>> is >> > >>>>>>> easier to understand to developers than "deciding the processor >> > >>> name >> > >>>>> for >> > >>>>>>> the next operator". >> > >>>>>>> >> > >>>>>>> Re 2: Yeah I'm thinking that for operators that translates to >> > >>>> multiple >> > >>>>>>> processor names, we can still use the provided "hint" to name >> the >> > >>>>>> processor >> > >>>>>>> names, e.g. for Joins we can name them as `join-foo-this` and >> > >>>>>>> `join-foo-that` etc if user calls `as("foo")`. >> > >>>>>>> >> > >>>>>>> Re 3: The motivation I had about removing the suffix is that it >> > >> has >> > >>>>> huge >> > >>>>>>> restrictions on topology compatibilities: consider if user code >> > >>>> added a >> > >>>>>> new >> > >>>>>>> operator, or library does some optimization to remove some >> > >>> operators, >> > >>>>> the >> > >>>>>>> suffix indexing may be changed for a large amount of the >> > >> processor >> > >>>>> names: >> > >>>>>>> this will in turn change the internal state store names, as well >> > >> as >> > >>>>>>> internal topic names as well, making the new application >> topology >> > >>> to >> > >>>> be >> > >>>>>>> incompatible with the ones. One rationale I had about this KIP >> is >> > >>>> that >> > >>>>>>> aligned this effort, moving forward we can allow users to >> > >> customize >> > >>>>>>> internal names so that they can still be reused even with >> > >> topology >> > >>>>>> changes >> > >>>>>>> (e.g. KIP-230), so I think removing the suffix index would be >> > >> more >> > >>>>>>> applicable in the long run. >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> Guozhang >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> On Thu, May 31, 2018 at 3:08 PM, Florian Hussonnois < >> > >>>>>> fhussonn...@gmail.com> >> > >>>>>>> wrote: >> > >>>>>>> >> > >>>>>>>> Hi , >> > >>>>>>>> Thank you very much for your feedback. >> > >>>>>>>> >> > >>>>>>>> 1/ >> > >>>>>>>> I agree that overloading most of the methods with a Processed >> is >> > >>> not >> > >>>>>> ideal. >> > >>>>>>>> I've started modifying the KStream API and I got to the same >> > >>>>> conclusion. >> > >>>>>>>> Also ading a new method directly to KStreamImpl and KTableImpl >> > >>>> classes >> > >>>>>>>> seems to be a better option. >> > >>>>>>>> >> > >>>>>>>> However a processor name cannot be redefined after calling an >> > >>>> operator >> > >>>>>> (or >> > >>>>>>>> maybe I miss something in the code). >> > >>>>>>>> From my understanding, this will only set the KStream name >> > >>> property >> > >>>>> not >> > >>>>>> the >> > >>>>>>>> processor name previsouly added to the topology builder - >> > >> leading >> > >>> to >> > >>>>>>>> InvalidTopology exception. >> > >>>>>>>> >> > >>>>>>>> So the new method should actually defines the name of the next >> > >>>>>> processor : >> > >>>>>>>> Below is an example : >> > >>>>>>>> >> > >>>>>>>> *stream.as <http://stream.as >> > >>>> (Processed.name("MAPPE_TO_UPPERCASE")* >> > >>>>>>>> * .map( (k, v) -> KeyValue.pair(k, v.toUpperCase()))* >> > >>>>>>>> >> > >>>>>>>> I think this approach could solve the cases for methods >> > >> returning >> > >>>>> void ? >> > >>>>>>>> >> > >>>>>>>> Regarding this new method we have two possible implementations >> : >> > >>>>>>>> >> > >>>>>>>> 1. Adding a method like : withName(String processorName) >> > >>>>>>>> 2. or adding a method accepting an Processed object : >> > >>>>> as(Processed). >> > >>>>>>>> >> > >>>>>>>> I think solution 2. is preferable as the Processed class could >> > >> be >> > >>>>>> enriched >> > >>>>>>>> further (in futur). >> > >>>>>>>> >> > >>>>>>>> 2/ >> > >>>>>>>> As Guozhang said some operators add internal processors. >> > >>>>>>>> For example the branch() method create one KStreamBranch >> > >> processor >> > >>>> to >> > >>>>>> route >> > >>>>>>>> records and one KStreamPassThrough processor for each branch. >> > >>>>>>>> In that situation only the parent processor can be named. For >> > >>>> children >> > >>>>>>>> processors we could keep the current behaviour that add a >> suffix >> > >>>> (i.e >> > >>>>>>>> KSTREAM-BRANCHCHILD-) >> > >>>>>>>> >> > >>>>>>>> This also the case for the join() method that result to adding >> > >>>>> multiple >> > >>>>>>>> processors to the topology (windowing, left/right joins and a >> > >>> merge >> > >>>>>>>> processor). >> > >>>>>>>> I think, like for the branch method users could only define a >> > >>>>> processor >> > >>>>>>>> name prefix. >> > >>>>>>>> >> > >>>>>>>> 3/ >> > >>>>>>>> I think we should still added a suffix like "-0000000000" to >> > >>>>> processor >> > >>>>>>>> name and enforce uppercases as this will keep some consistency >> > >>> with >> > >>>>> the >> > >>>>>>>> ones generated by the API. >> > >>>>>>>> >> > >>>>>>>> 4/ >> > >>>>>>>> Yes, the KTable interface should be modified like KStream to >> > >> allow >> > >>>>>> custom >> > >>>>>>>> processor names definition. >> > >>>>>>>> >> > >>>>>>>> Thanks, >> > >>>>>>>> >> > >>>>>>>> >> > >>>>>>>> Le jeu. 31 mai 2018 à 19:18, Damian Guy <damian....@gmail.com> >> > >> a >> > >>>>> écrit >> > >>>>>> : >> > >>>>>>>> >> > >>>>>>>>> Hi Florian, >> > >>>>>>>>> >> > >>>>>>>>> Thanks for the KIP. What about KTable and other DSL >> interfaces? >> > >>>> Will >> > >>>>>> they >> > >>>>>>>>> not want to be able to do the same thing? >> > >>>>>>>>> It would be good to see a complete set of the public API >> > >> changes. >> > >>>>>>>>> >> > >>>>>>>>> Cheers, >> > >>>>>>>>> Damian >> > >>>>>>>>> >> > >>>>>>>>> On Wed, 30 May 2018 at 19:45 Guozhang Wang < >> wangg...@gmail.com >> > >>> >> > >>>>> wrote: >> > >>>>>>>>> >> > >>>>>>>>>> Hello Florian, >> > >>>>>>>>>> >> > >>>>>>>>>> Thanks for the KIP. I have some meta feedbacks on the >> > >> proposal: >> > >>>>>>>>>> >> > >>>>>>>>>> 1. You mentioned that this `Processed` object will be added >> > >> to a >> > >>>> new >> > >>>>>>>>>> overloaded variant of all the stateless operators, what about >> > >>> the >> > >>>>>>>>> stateful >> > >>>>>>>>>> operators? Would like to hear your opinions if you have >> > >> thought >> > >>>>> about >> > >>>>>>>>> that: >> > >>>>>>>>>> note for stateful operators they will usually be mapped to >> > >>>> multiple >> > >>>>>>>>>> processor node names, so we probably need to come up with >> some >> > >>>> ways >> > >>>>> to >> > >>>>>>>>>> define all their names. >> > >>>>>>>>>> >> > >>>>>>>>>> 2. I share the same concern with Bill as for adding lots of >> > >> new >> > >>>>>>>> overload >> > >>>>>>>>>> functions into the stateless operators, as we have just spent >> > >>>> quite >> > >>>>>>>> some >> > >>>>>>>>>> effort in trimming them since 1.0.0 release. If the goal is >> to >> > >>>> just >> > >>>>>>>>> provide >> > >>>>>>>>>> some "hints" on the generated processor node names, not >> > >> strictly >> > >>>>>>>>> enforcing >> > >>>>>>>>>> the exact names that to be generated, then how about we just >> > >>> add a >> > >>>>> new >> > >>>>>>>>>> function to `KStream` and `KTable` classes like: >> > >>> "as(Processed)", >> > >>>>> with >> > >>>>>>>>> the >> > >>>>>>>>>> semantics as "the latest operators that generate this KStream >> > >> / >> > >>>>> KTable >> > >>>>>>>>> will >> > >>>>>>>>>> be named accordingly to this hint". >> > >>>>>>>>>> >> > >>>>>>>>>> The only caveat, is that for all operators like `KStream#to` >> > >> and >> > >>>>>>>>>> `KStream#print` that returns void, this alternative would not >> > >>>> work. >> > >>>>>> But >> > >>>>>>>>> for >> > >>>>>>>>>> the current operators: >> > >>>>>>>>>> >> > >>>>>>>>>> a. KStream#print, >> > >>>>>>>>>> b. KStream#foreach, >> > >>>>>>>>>> c. KStream#to, >> > >>>>>>>>>> d. KStream#process >> > >>>>>>>>>> >> > >>>>>>>>>> I personally felt that except `KStream#process` users would >> > >> not >> > >>>>>> usually >> > >>>>>>>>>> bother to override their names, and for `KStream#process` we >> > >>> could >> > >>>>> add >> > >>>>>>>> an >> > >>>>>>>>>> overload variant with the additional Processed object. >> > >>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> 3. In your example, the processor names are still added with >> a >> > >>>>> suffix >> > >>>>>>>>> like >> > >>>>>>>>>> " >> > >>>>>>>>>> -0000000000", is this intentional? If yes, why (I thought >> with >> > >>>> user >> > >>>>>>>>>> specified processor name hints we will not add suffix to >> > >>>> distinguish >> > >>>>>>>>>> different nodes of the same type any more)? >> > >>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> Guozhang >> > >>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> On Tue, May 29, 2018 at 6:47 AM, Bill Bejeck < >> > >> bbej...@gmail.com >> > >>>> >> > >>>>>>>> wrote: >> > >>>>>>>>>> >> > >>>>>>>>>>> Hi Florian, >> > >>>>>>>>>>> >> > >>>>>>>>>>> Thanks for the KIP. I think being able to add more context >> > >> to >> > >>>> the >> > >>>>>>>>>>> processor names would be useful. >> > >>>>>>>>>>> >> > >>>>>>>>>>> I like the idea of adding a "withProcessorName" to Produced, >> > >>>>> Consumed >> > >>>>>>>>> and >> > >>>>>>>>>>> Joined. >> > >>>>>>>>>>> >> > >>>>>>>>>>> But instead of adding the "Processed" parameter to a large >> > >>>>> percentage >> > >>>>>>>>> of >> > >>>>>>>>>>> the methods, which would result in overloaded methods (which >> > >> we >> > >>>>>>>> removed >> > >>>>>>>>>>> quite a bit with KIP-182) what do you think of adding a >> > >> method >> > >>>>>>>>>>> to the AbstractStream class "withName(String >> processorName)"? >> > >>> BTW >> > >>>>> I"m >> > >>>>>>>>> not >> > >>>>>>>>>>> married to the method name, it's the best I can do off the >> > >> top >> > >>> of >> > >>>>> my >> > >>>>>>>>>> head. >> > >>>>>>>>>>> >> > >>>>>>>>>>> For the methods that return void, we'd have to add a >> > >> parameter, >> > >>>> but >> > >>>>>>>>> that >> > >>>>>>>>>>> would at least cut down on the number of overloaded methods >> > >> in >> > >>>> the >> > >>>>>>>> API. >> > >>>>>>>>>>> >> > >>>>>>>>>>> Just my 2 cents. >> > >>>>>>>>>>> >> > >>>>>>>>>>> Thanks, >> > >>>>>>>>>>> Bill >> > >>>>>>>>>>> >> > >>>>>>>>>>> On Sun, May 27, 2018 at 4:13 PM, Florian Hussonnois < >> > >>>>>>>>>> fhussonn...@gmail.com >> > >>>>>>>>>>>> >> > >>>>>>>>>>> wrote: >> > >>>>>>>>>>> >> > >>>>>>>>>>>> Hi, >> > >>>>>>>>>>>> >> > >>>>>>>>>>>> I would like to start a new discussion on following KIP : >> > >>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- >> > >>>>>>>>>>>> >> > >>> 307%3A+Allow+to+define+custom+processor+names+with+KStreams+DSL >> > >>>>>>>>>>>> >> > >>>>>>>>>>>> This is still a draft. >> > >>>>>>>>>>>> >> > >>>>>>>>>>>> Looking forward for your feedback. >> > >>>>>>>>>>>> -- >> > >>>>>>>>>>>> Florian HUSSONNOIS >> > >>>>>>>>>>>> >> > >>>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> >> > >>>>>>>>>> -- >> > >>>>>>>>>> -- Guozhang >> > >>>>>>>>>> >> > >>>>>>>>> >> > >>>>>>>> >> > >>>>>>>> >> > >>>>>>>> -- >> > >>>>>>>> Florian HUSSONNOIS >> > >>>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>>> >> > >>>>>> >> > >>>>>> >> > >>>>> >> > >>>>> -- >> > >>>>> Florian HUSSONNOIS >> > >>>>> >> > >>>> >> > >>> >> > >>> >> > >>> >> > >>> -- >> > >>> -- Guozhang >> > >>> >> > >> >> > >> >> > >> -- >> > >> Florian HUSSONNOIS >> > >> >> > > >> > > >> > > >> > >> > >> >> -- >> Florian HUSSONNOIS >> > > > -- > -- Guozhang > -- -- Guozhang