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
>>
> 
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to