What is the status of this KIP? -Matthias
On 3/18/19 5:11 PM, Guozhang Wang wrote: > Hello Wladimir, > > Thanks for the replies. > > What do you mean by "the community has opted for the second more complex > solution"? Could you elaborate a bit more? > > Guozhang > > > On Sun, Mar 17, 2019 at 3:45 PM Wladimir Schmidt <wlsc....@gmail.com> wrote: > >> Hi Matthias, >> >> Sorry, due to other commitments I haven't started the other >> implementation yet. >> In the meantime, the community has opted for the second, more complex >> solution. >> I already had ideas in this regard, but their elaboration needs to be >> discussed more. >> >> >> Best greetings, >> Wladimir >> >> >> On 21-Feb-19 09:33, Matthias J. Sax wrote: >>> Hi Wladimir, >>> >>> what is the status of this KIP? >>> >>> -Matthias >>> >>> On 1/9/19 4:17 PM, Guozhang Wang wrote: >>>> Hello Wladimir, >>>> >>>> Just checking if you are still working on this KIP. We have the 2.2 KIP >>>> freeze deadline by 24th this month, and it'll be great to complete this >> KIP >>>> by then so 2.2.0 release could have this feature. >>>> >>>> >>>> Guozhang >>>> >>>> On Mon, Dec 3, 2018 at 11:26 PM Guozhang Wang <wangg...@gmail.com> >> wrote: >>>> >>>>> Hello Wladimir, >>>>> >>>>> I've thought about the two options and I think I'm sold on the second >>>>> option and actually I think it is better generalize it to be >> potentially >>>>> used for other clients (producer, consumer) as while since they also >> have >>>>> similar dependency injection requests for metrics reporter, >> partitioner, >>>>> partition assignor etc. >>>>> >>>>> So I'd suggest we add the following to AbstractConfig directly (note I >>>>> intentionally renamed the class to ConfiguredInstanceFactory to be >> used for >>>>> other clients as well): >>>>> >>>>> ``` >>>>> AbstractConfig(ConfigDef definition, Map<?, ?> originals, >>>>> ConfiguredInstanceFactory, boolean doLog) >>>>> ``` >>>>> >>>>> And then in StreamsConfig add: >>>>> >>>>> ``` >>>>> StreamsConfig(Map<?, ?> props, ConfiguredInstanceFactory) >>>>> ``` >>>>> >>>>> which would call the above AbstractConfig constructor (we can leave to >>>>> core team to decide when they want to add for producer and consumer); >>>>> >>>>> And in KafkaStreams / TopologyTestDriver we can add one overloaded >>>>> constructor each that includes all the parameters including the >>>>> ConfiguredInstanceFactory --- for those who only want `factory` but not >>>>> `client-suppliers` for example, they can set it to `null` and the >> streams >>>>> library will just use the default one. >>>>> >>>>> >>>>> Guozhang >>>>> >>>>> >>>>> On Sun, Dec 2, 2018 at 12:13 PM Wladimir Schmidt <wlsc....@gmail.com> >>>>> wrote: >>>>> >>>>>> Hello Guozhang, >>>>>> sure, the first approach is very straight-forward and allows minimal >>>>>> changes to the Kafka Streams API. >>>>>> On the other hand, second approach with the interface implementation >>>>>> looks more cleaner to me. >>>>>> I totally agree that this should be first discussed before will be >>>>>> implemented. >>>>>> >>>>>> Thanks, Wladimir >>>>>> >>>>>> >>>>>> On 17-Nov-18 23:37, Guozhang Wang wrote: >>>>>> >>>>>> Hello folks, >>>>>> >>>>>> I'd like to revive this thread for discussion. After reading the >> previous >>>>>> emails I think I'm still a bit leaning towards re-enabling to pass in >>>>>> StreamsConfig to Kafka Streams constructors compared with a >>>>>> ConfiguredStreamsFactory as additional parameters to overloaded >>>>>> KafkaStreams constructors: although the former seems less cleaner as >> it >>>>>> requires users to read through the usage of AbstractConfig to know >> how to >>>>>> use it in their frameworks, this to me is a solvable problem through >>>>>> documentations, plus AbstractConfig is a public interface already and >> hence >>>>>> the additional ConfiguredStreamsFactory to me is really a bit >> overlapping >>>>>> in functionality. >>>>>> >>>>>> >>>>>> Guozhang >>>>>> >>>>>> >>>>>> >>>>>> On Sun, Oct 21, 2018 at 1:41 PM Wladimir Schmidt <wlsc....@gmail.com> >> <wlsc....@gmail.com> wrote: >>>>>> >>>>>> >>>>>> Hi Damian, >>>>>> >>>>>> The first approach was added only because it had been initially >> proposed >>>>>> in my pull request, >>>>>> which started a discussion and thus, the KIP-378 was born. >>>>>> >>>>>> Yes, I would like to have something "injectable". In this regard, a >>>>>> `ConfiguredStreamsFactory` (name is a subject to discussion) >>>>>> is a good option to be introduced into `KafkaStreams` constructor. >>>>>> >>>>>> Even though, I consider the second approach to be cleaner, it >> involves a >>>>>> certain amount of refactoring of the streams library. >>>>>> The first approach, on the contrary, adds (or removes deprecated >>>>>> annotation, if the method has not been removed yet) only additional >>>>>> constructors with >>>>>> considerably less intervention into a streams library (no changes, >> which >>>>>> would break an API. Please see a pull request: >> https://github.com/apache/kafka/pull/5344). >>>>>> >>>>>> Thanks >>>>>> Wladimir >>>>>> >>>>>> On 10-Oct-18 15:51, Damian Guy wrote: >>>>>> >>>>>> Hi Wladimir, >>>>>> >>>>>> Of the two approaches in the KIP - i feel the second approach is >> cleaner. >>>>>> However, am i correct in assuming that you want to have the >>>>>> `ConfiguredStreamsFactory` as a ctor arg in `StreamsConfig` so that >>>>>> >>>>>> Spring >>>>>> >>>>>> can inject this for you? >>>>>> >>>>>> Otherwise you could just put the ApplicationContext as a property in >> the >>>>>> config and then use that via the configure method of the appropriate >>>>>> handler to get your actual handler. >>>>>> >>>>>> Thanks, >>>>>> Damian >>>>>> >>>>>> On Tue, 9 Oct 2018 at 01:55, Guozhang Wang <wangg...@gmail.com> < >> wangg...@gmail.com> wrote: >>>>>> >>>>>> >>>>>> John, thanks for the explanation, now it makes much more sense to me. >>>>>> >>>>>> As for the concrete approach, to me it seems the first option requires >>>>>> >>>>>> less >>>>>> >>>>>> changes than the second (ConfiguredStreamsFactory based) approach, >>>>>> >>>>>> whereas >>>>>> >>>>>> the second one requires an additional interface that is overlapping >> with >>>>>> the AbstractConfig. >>>>>> >>>>>> I'm aware that in KafkaProducer / KafkaConsumer we do not have public >>>>>> constructors for taking a ProducerConfig or ConsumerConfig directly, >> and >>>>>> anyone using Spring can share how you've worked around it by far? If >> it >>>>>> >>>>>> is >>>>>> >>>>>> very awkward I'm not against just adding the XXXConfigs to the >>>>>> >>>>>> constructors >>>>>> >>>>>> directly. >>>>>> >>>>>> Guozhang >>>>>> >>>>>> On Fri, Oct 5, 2018 at 1:48 PM, John Roesler <j...@confluent.io> < >> j...@confluent.io> wrote: >>>>>> >>>>>> >>>>>> Hi Wladimir, >>>>>> >>>>>> Thanks for the KIP! >>>>>> >>>>>> As I mentioned in the PR discussion, I personally prefer not to >>>>>> >>>>>> recommend >>>>>> >>>>>> overriding StreamsConfig for this purpose. >>>>>> >>>>>> It seems like a person wishing to create a DI shim would have to >>>>>> >>>>>> acquire >>>>>> >>>>>> quite a deep understanding of the class and its usage to figure out >>>>>> >>>>>> what >>>>>> >>>>>> exactly to override to accomplish their goals without breaking >>>>>> >>>>>> everything. >>>>>> >>>>>> I'm honestly impressed with the method you came up with to create your >>>>>> Spring/Streams shim. >>>>>> >>>>>> I think we can make to path for the next person smoother by going with >>>>>> something more akin to the ConfiguredStreamsFactory. This is a >>>>>> >>>>>> constrained >>>>>> >>>>>> interface that tells you exactly what you have to implement to create >>>>>> >>>>>> such >>>>>> >>>>>> a shim. >>>>>> >>>>>> A few thoughts: >>>>>> 1. it seems like we can keep all the deprecated constructors still >>>>>> deprecated >>>>>> >>>>>> 2. we could add just one additional constructor to each of >> KafkaStreams >>>>>> >>>>>> and >>>>>> >>>>>> TopologyTestDriver to still take a Properties, but also your new >>>>>> ConfiguredStreamsFactory >>>>>> >>>>>> 3. I don't know if I'm sold on the name ConfiguredStreamsFactory, >> since >>>>>> >>>>>> it >>>>>> >>>>>> does not produce configured streams. Instead, it produces configured >>>>>> instances... How about ConfiguredInstanceFactory? >>>>>> >>>>>> 4. if I understand the usage correctly, it's actually a pretty small >>>>>> >>>>>> number >>>>>> >>>>>> of classes that we actually make via getConfiguredInstance. Offhand, I >>>>>> >>>>>> can >>>>>> >>>>>> think of the key/value Serdes, the deserialization exception handler, >>>>>> >>>>>> and >>>>>> >>>>>> the production exception handler. >>>>>> Perhaps, instead of maintaining a generic "class instantiator", we >>>>>> >>>>>> could >>>>>> >>>>>> explore a factory interface that just has methods for creating exactly >>>>>> >>>>>> the >>>>>> >>>>>> kinds of things we need to create. In fact, we already have something >>>>>> >>>>>> like >>>>>> >>>>>> this: org.apache.kafka.streams.KafkaClientSupplier . Do you think we >>>>>> >>>>>> could >>>>>> >>>>>> just add some more methods to that interface (and maybe rename it) >>>>>> >>>>>> instead? >>>>>> >>>>>> Thanks, >>>>>> -John >>>>>> >>>>>> On Fri, Oct 5, 2018 at 3:31 PM John Roesler <j...@confluent.io> < >> j...@confluent.io> wrote: >>>>>> >>>>>> >>>>>> Hi Guozhang, >>>>>> >>>>>> I'm going to drop in a little extra context from the preliminary PR >>>>>> discussion (https://github.com/apache/kafka/pull/5344). >>>>>> >>>>>> The issue isn't that it's impossible to use Streams within a Spring >>>>>> >>>>>> app, >>>>>> >>>>>> just that the interplay between our style of >>>>>> >>>>>> construction/configuration >>>>>> >>>>>> and >>>>>> >>>>>> Spring's is somewhat awkward compared to the normal experience with >>>>>> dependency injection. >>>>>> >>>>>> I'm guessing users of dependency injection would not like the approach >>>>>> >>>>>> you >>>>>> >>>>>> offered. I believe it's commonly considered an antipattern when using >>>>>> >>>>>> DI >>>>>> >>>>>> frameworks to pass the injector directly into the class being >>>>>> >>>>>> constructed. >>>>>> >>>>>> Wladimir has also offered an alternative usage within the current >>>>>> >>>>>> framework >>>>>> >>>>>> of injecting pre-constructed dependencies into the Properties, and >>>>>> >>>>>> then >>>>>> >>>>>> retrieving and casting them inside the configured class. >>>>>> >>>>>> It seems like this KIP is more about offering a more elegant interface >>>>>> >>>>>> to >>>>>> >>>>>> DI users. >>>>>> >>>>>> One of the points that Wladimir raised on his PR discussion was the >>>>>> >>>>>> desire >>>>>> >>>>>> to configure the classes in a typesafe way in the constructor (thus >>>>>> allowing the use of immutable classes). >>>>>> >>>>>> With this KIP, it would be possible for a DI user to: >>>>>> 1. register a Streams-Spring or Streams-Guice (etc) "plugin" (via >>>>>> >>>>>> either >>>>>> >>>>>> of the mechanisms he proposed) >>>>>> 2. simply make the Serdes, exception handlers, etc, available on the >>>>>> >>>>>> class >>>>>> >>>>>> path with the DI annotations >>>>>> 3. start the app >>>>>> >>>>>> There's no need to mess with passing dependencies (or the injector) >>>>>> through the properties. >>>>>> >>>>>> Sorry for "injecting" myself into your discussion, but it took me a >>>>>> >>>>>> while >>>>>> >>>>>> in the PR discussion to get to the bottom of the issue, and I wanted >>>>>> >>>>>> to >>>>>> >>>>>> spare you the same. >>>>>> >>>>>> I'll respond separately with my feedback on the KIP. >>>>>> >>>>>> Thanks, >>>>>> -John >>>>>> >>>>>> On Sun, Sep 30, 2018 at 2:31 PM Guozhang Wang <wangg...@gmail.com> < >> wangg...@gmail.com> >>>>>> >>>>>> wrote: >>>>>> >>>>>> Hello Wladimir, >>>>>> >>>>>> Thanks for proposing the KIP. I think the injection can currently be >>>>>> >>>>>> done >>>>>> >>>>>> by passing in the key/value pair directly into the properties which >>>>>> >>>>>> can >>>>>> >>>>>> then be accessed from the `ProcessorContext#appConfigs` or >>>>>> `#appConfigsWithPrefix`. For example, when constructing the >>>>>> >>>>>> properties >>>>>> >>>>>> you >>>>>> >>>>>> can: >>>>>> >>>>>> ``` >>>>>> props.put(myProp1, myValue1); >>>>>> props.put(myProp2, myValue1); >>>>>> props.put("my_app_context", appContext); >>>>>> >>>>>> KafkaStreams myApp = new KafkaStreams(topology, props); >>>>>> >>>>>> // and then in your processor, on the processor where you want to >>>>>> construct >>>>>> the injected handler: >>>>>> >>>>>> Map<String, Object> appProps = processorContext.appConfigs(); >>>>>> ApplicationContext appContext = appProps.get("my_app_context"); >>>>>> MyHandler myHandler = >>>>>> applicationContext.getBeanNamesForType(MyHandlerClassType); >>>>>> ``` >>>>>> >>>>>> Does that work for you? >>>>>> >>>>>> Guozhang >>>>>> >>>>>> >>>>>> On Sun, Sep 30, 2018 at 6:56 AM, Dongjin Lee <dong...@apache.org> < >> dong...@apache.org> >>>>>> >>>>>> wrote: >>>>>> >>>>>> Hi Wladimir, >>>>>> >>>>>> Thanks for your great KIP. Let me have a look. And let's discuss >>>>>> >>>>>> this >>>>>> >>>>>> KIP >>>>>> >>>>>> in depth after the release of 2.1.0. (The committers are very busy >>>>>> >>>>>> for >>>>>> >>>>>> it.) >>>>>> >>>>>> Best, >>>>>> Dongjin >>>>>> >>>>>> On Sun, Sep 30, 2018 at 10:49 PM Wladimir Schmidt < >>>>>> >>>>>> wlsc....@gmail.com >>>>>> >>>>>> wrote: >>>>>> >>>>>> >>>>>> Dear colleagues, >>>>>> >>>>>> I am happy to inform you that I have just finished my first KIP >>>>>> (KIP-378: Enable Dependency Injection for Kafka Streams handlers >>>>>> <https://cwiki.apache.org/confluence/display/KAFKA/KIP- >>>>>> >>>>>> 378%3A+Enable+Dependency+Injection+for+Kafka+Streams+handlers >>>>>> >>>>>> ). >>>>>> >>>>>> Your feedback on this submission would be highly appreciated. >>>>>> >>>>>> Best Regards, >>>>>> Wladimir Schmidt >>>>>> >>>>>> >>>>>> -- >>>>>> *Dongjin Lee* >>>>>> >>>>>> *A hitchhiker in the mathematical world.* >>>>>> >>>>>> *github: <http://goog_969573159/> <http://goog_969573159/> >> github.com/dongjinleekr<http://github.com/dongjinleekr> < >> http://github.com/dongjinleekr>linkedin: >>>>>> >>>>>> kr.linkedin.com/in/dongjinleekr >>>>>> >>>>>> <http://kr.linkedin.com/in/dongjinleekr> < >> http://kr.linkedin.com/in/dongjinleekr>slideshare: >> www.slideshare.net/dongjinleekr<http://www.slideshare.net/dongjinleekr> < >> http://www.slideshare.net/dongjinleekr>* >>>>>> >>>>>> >>>>>> -- >>>>>> -- Guozhang >>>>>> >>>>>> >>>>>> -- >>>>>> -- Guozhang >>>>>> >>>>>> >>>>>> >>>>> -- >>>>> -- Guozhang >>>>> >>>> >> > >
signature.asc
Description: OpenPGP digital signature