Ewen,

I cannot completely follow your argument. Can you elaborate a little
bit? After reading you mail, I am not sure if you prefer config
inheritance or not? And if, to what extend?


> In that mode if you override *anything*, you
>> should specify *everything*.

Can you give an example for this?


> But if it was just, e.g. group.id, client.id,
>> and offset.reset that needed adjustment for a restoreConsumer, that would
>> be the default and everything else is inherited.

Don't understand this part.


> I think
>> inheritance in these configuration setups needs to be approached very
>> carefully.

Agreed. I think that our approach is carefully designed though.


For follow up on Guozhang's argument, I agree with him, that for most
users the existing prefix would be good enough and the three new
prefixes are for advanced users.



-Matthias

On 4/5/18 11:37 AM, Guozhang Wang wrote:
> Ewen, thanks for your thoughts.
> 
> Just to clarify the current KIP does not propose for four new prefixes, but
> three plus the existing one. So it is
> 
> "consumer"
> "main.consumer"
> "restore.consumer"
> "global.consumer"
> 
> 
> If we design the configs for the first time, I'd be in favor of only
> keeping the last three prefixes. But as of now we have a compatibility
> issue to consider. So the question is if it is worthwhile to break the
> compatibility and enforce users to make code changes. My rationale is that:
> 
> 1) for normal users they would not bother overriding configs for different
> types of consumers, where "consumer" prefix is good enough for them; and
> today they probably have already made those overrides via "consumer".
> 
> 2) for advanced users they would need some additional overrides for
> different types of consumers, and they would go ahead and learn about the
> other three prefixes and set them there.
> 
> 
> I agree that four prefixes would be more confusing, but if we think use
> case 1)'s popularity is much larger than use case 2), which by the way we
> can still debate on, then I'd argue it's better to not force normal user
> groups from 1) to make code changes to make advanced users from 2) less
> confused about the hierarchy.
> 
> 
> Guozhang
> 
> 
> 
> 
> 
> 
> On Wed, Apr 4, 2018 at 11:23 PM, Ewen Cheslack-Postava <e...@confluent.io>
> wrote:
> 
>> I think this model is more confusing than it needs to be.
>>
>> We end up with 4 prefixes despite only have 3 types of consumers. We have
>> prefixes for: "base", "main", "global", and "restore". However, we only
>> instantiate consumers of type "main", "global", and "restore".
>>
>> Until now, we've only had two types of configs mapping to two types of
>> consumers, despite internally having some common shared configs as a
>> baseline to bootstrap the two "public" ones (see
>> StreamsConfig.getCommonConsumerConfigs). Do we want to complicate this to
>> 4
>> levels of "public" configs when there are only 3 types of concrete configs
>> we instantiate?
>>
>> More generally, I worry that we're optimizing too much to avoid copy/paste
>> in less common cases to the point that we would confuse users with yet more
>> concepts before they can even write their configuration. What if we took an
>> (perhaps modified) all or nothing approach to inheriting from the the
>> "main" consumer properties? In that mode if you override *anything*, you
>> should specify *everything*. But if it was just, e.g. group.id, client.id,
>> and offset.reset that needed adjustment for a restoreConsumer, that would
>> be the default and everything else is inherited. Same deal for a clearly
>> specified set of configs for global consumers that required override.
>>
>> I feel like I'm also concurrently seeing the opposite side of this problem
>> in Connect where we namespaced and didn't proactively implement
>> inheritance; and while people find the config duplication annoying (and
>> confusing!), we inevitably find cases where they need it. I think
>> inheritance in these configuration setups needs to be approached very
>> carefully. Admittedly, some of the challenges in Connect don't appear here
>> (e.g. conflicts in producer/consumer config naming, since this is a
>> Consumer-only KIP), but similar problems arise.
>>
>> -Ewen
>>
>> On Wed, Apr 4, 2018 at 10:56 PM, Boyang Chen <bche...@outlook.com> wrote:
>>
>>> Thanks Guozhang! I already updated the pull request and KIP to deprecate
>>> getConsumerConfigs() function. Do you think we could move to a voting
>> stage
>>> now?
>>>
>>>
>>> ________________________________
>>> From: Guozhang Wang <wangg...@gmail.com>
>>> Sent: Thursday, April 5, 2018 9:52 AM
>>> To: dev@kafka.apache.org
>>> Subject: Re: [DISCUSS] KIP-276: Add StreamsConfig prefix for different
>>> consumers
>>>
>>> I agree that renaming the method in this case may not worth it. Let's
>> keep
>>> the existing function names.
>>>
>>> On Wed, Apr 4, 2018 at 6:06 PM, Matthias J. Sax <matth...@confluent.io>
>>> wrote:
>>>
>>>> Thanks for updating the KIP.
>>>>
>>>> One more comment. Even if we don't expect users to call
>>>> `StreamsConfig#getConsumerConfigs()` it is still public API. Thus, we
>>>> cannot just rename the method.
>>>>
>>>> I think we have two options: either we keep the current name or we
>>>> deprecate the method and introduce `getMainConsumerConfigs()` in
>>>> parallel. The deprecated method would just call the new method.
>>>>
>>>> I am not sure if we gain a lot renaming the method, thus I have a
>> slight
>>>> preference in just keeping the method name as is. (But I am also ok to
>>>> rename it, if people prefer this)
>>>>
>>>> -Matthias
>>>>
>>>>
>>>> On 4/3/18 1:59 PM, Bill Bejeck wrote:
>>>>> Boyang,
>>>>>
>>>>> Thanks for making changes to the KIP,  I'm +1 on the updated version.
>>>>>
>>>>> -Bill
>>>>>
>>>>> On Tue, Apr 3, 2018 at 1:14 AM, Boyang Chen <bche...@outlook.com>
>>> wrote:
>>>>>
>>>>>> Hey friends,
>>>>>>
>>>>>>
>>>>>> both KIP<https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>> 276+Add+StreamsConfig+prefix+for+different+consumers> and pull
>>> request<
>>>>>> https://github.com/apache/kafka/pull/4805> are updated. Feel free
>> to
>>>> take
>>>>>> another look.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks for your valuable feedback!
>>>>>>
>>>>>>
>>>>>> Best,
>>>>>>
>>>>>> Boyang
>>>>>>
>>>>>> ________________________________
>>>>>> From: Boyang Chen <bche...@outlook.com>
>>>>>> Sent: Tuesday, April 3, 2018 11:39 AM
>>>>>> To: dev@kafka.apache.org
>>>>>> Subject: Re: [DISCUSS] KIP-276: Add StreamsConfig prefix for
>> different
>>>>>> consumers
>>>>>>
>>>>>> Thanks Matthias, Ted and Guozhang for the inputs. I shall address
>> them
>>>> in
>>>>>> next round.
>>>>>>
>>>>>>
>>>>>> ________________________________
>>>>>> From: Matthias J. Sax <matth...@confluent.io>
>>>>>> Sent: Tuesday, April 3, 2018 4:43 AM
>>>>>> To: dev@kafka.apache.org
>>>>>> Subject: Re: [DISCUSS] KIP-276: Add StreamsConfig prefix for
>> different
>>>>>> consumers
>>>>>>
>>>>>> Yes, your examples make sense to me. That was the idea behind the
>>>> proposal.
>>>>>>
>>>>>>
>>>>>> -Matthias
>>>>>>
>>>>>> On 4/2/18 11:25 AM, Guozhang Wang wrote:
>>>>>>> @Matthias
>>>>>>>
>>>>>>> That's a good question: I think adding another config for the main
>>>>>> consumer
>>>>>>> makes good tradeoffs between compatibility and new user
>> convenience.
>>>> Just
>>>>>>> to clarify, from user's pov on upgrade:
>>>>>>>
>>>>>>> 1) I'm already overriding some consumer configs, and now I want to
>>>>>> override
>>>>>>> these values differently for restore consumers, I'd add one new
>> line
>>>> for
>>>>>>> the restore consumer prefix.
>>>>>>>
>>>>>>> 2) I'm already overriding some consumer configs, and now I want to
>>> NOT
>>>>>>> overriding them for restore consumers, I'd change my override from
>>>>>>> `consumer.X` to `main.consumer.X`.
>>>>>>>
>>>>>>> 3) I'm new and have not any consumer overrides, and now if I want
>> to
>>>>>>> override some, I'd use `main.consumer`, `restore.consumer` for
>>> specific
>>>>>>> consumer types, and ONLY consider `consumer` for the ones that I
>> want
>>>> to
>>>>>>> apply universally.
>>>>>>>
>>>>>>> 4) I'm already overriding some consumer configs and I'm happy with
>>>> what I
>>>>>>> get, I do not change anything.
>>>>>>>
>>>>>>>
>>>>>>> Guozhang
>>>>>>>
>>>>>>> On Mon, Apr 2, 2018 at 11:10 AM, Ted Yu <yuzhih...@gmail.com>
>> wrote:
>>>>>>>
>>>>>>>> bq. to introduce one more prefix `main.consumer.`
>>>>>>>>
>>>>>>>> Makes sense.
>>>>>>>>
>>>>>>>> On Mon, Apr 2, 2018 at 11:06 AM, Matthias J. Sax <
>>>> matth...@confluent.io
>>>>>>>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Boyang,
>>>>>>>>>
>>>>>>>>> thanks a lot for the KIP.
>>>>>>>>>
>>>>>>>>> Couple of questions:
>>>>>>>>>
>>>>>>>>>> (MODIFIED) public Map<String, Object> getRestoreConsumerConfigs(
>>>> final
>>>>>>>>> String clientId);
>>>>>>>>>
>>>>>>>>> You mean that the implementation/semantics of this method
>> changes,
>>>> but
>>>>>>>>> not the API itself? Might be good to add this as "comment style"
>>>>>> instead
>>>>>>>>> of "(MODIFIED)" prefix.
>>>>>>>>>
>>>>>>>>>> By rewriting the getRestoreConsumerConfigs() function and adding
>>> the
>>>>>>>>> getGlobalConsumerConfigs() function, if one user uses
>>>>>>>>> restoreConsumerPrefix() or globalConsumerPrefix() when adding new
>>>>>>>>> configurations, the configs shall overwrite base consumer config.
>>> If
>>>>>> not
>>>>>>>>> specified, restore consumer and global consumer shall share the
>>> same
>>>>>>>> config
>>>>>>>>> with base consumer.
>>>>>>>>>
>>>>>>>>> While this does make sense for backward compatibility, I am
>> wonder
>>> if
>>>>>> it
>>>>>>>>> makes the config "inheritance logic" (ie, hierarchy) too complex?
>>> We
>>>>>>>>> basically introduce a second level of overwrites. It might be
>>> simpler
>>>>>> to
>>>>>>>>> not introduce this hierarchy with the cost to break backward
>>>>>>>> compatibility.
>>>>>>>>>
>>>>>>>>> For example, config `request.timeout.ms`:
>>>>>>>>>
>>>>>>>>> User sets `request.timeout.ms=<user-value>`
>>>>>>>>> To change it for the main consumer, user also sets
>>>>>>>>> `consumer.request.timeout.ms=<consumer-value>`
>>>>>>>>>
>>>>>>>>> If user only wants to change the config for main consumer, but
>> not
>>>> for
>>>>>>>>> global or restore consumer, user needs to add two more configs:
>>>>>>>>>
>>>>>>>>> `restore.consumer.request.timeout.ms=<user-value>`
>>>>>>>>> and
>>>>>>>>> `global.consumer.request.timeout.ms=<user-value>`
>>>>>>>>>
>>>>>>>>> to reset both back to the default config. IMHO, this is not an
>>>> optimal
>>>>>>>>> user experience. Thus, it might be worth to change the semantics
>>> for
>>>>>>>>> `consumer.` prefix to only apply those configs to the main
>>> consumer.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Not sure what other think what the better solution is (I am not
>>> sure
>>>> by
>>>>>>>>> myself to be honest---just wanted to point it out and discuss the
>>>>>>>>> pros/cons for both).
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Another though would be, to introduce one more prefix
>>>> `main.consumer.`
>>>>>>>>> -- using this, the existing `consumer.` prefix would apply to all
>>>>>>>>> consumers (keeping it's current semantics) while we have
>> overwrites
>>>> for
>>>>>>>>> all three consumers -- this allow to directly set `main.consumer`
>>>>>>>>> instead of `consumer` avoiding the weird pattern from my example
>>>> above
>>>>>>>>> and preserves backward compatibility. Ie, if we introduce an
>>>> hierarchy
>>>>>>>>> of overwrite, a "full" hierarchy might be better than a "partial"
>>>>>>>>> hierarchy.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Looking forward to your thoughts.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -Matthias
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 4/1/18 5:55 PM, Guozhang Wang wrote:
>>>>>>>>>> Thanks for the KIP Boyang, the KIP looks good to me.
>>>>>>>>>>
>>>>>>>>>> For config values, we use underscore for keeping a single word;
>>> for
>>>>>>>>> config
>>>>>>>>>> keys, though, we do not use underscores or dashes. I'd suggest
>>> using
>>>>>>>> dots
>>>>>>>>>> to be consistent with others.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Otherwise I'm +1 on the KIP.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Guozhang
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Sun, Apr 1, 2018 at 10:56 AM, Ted Yu <yuzhih...@gmail.com>
>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Looks good overall.
>>>>>>>>>>>
>>>>>>>>>>> public static final String RESTORE_CONSUMER_PREFIX =
>>>>>>>>> "restore-consumer.";
>>>>>>>>>>>
>>>>>>>>>>> For other constants in StreamsConfig, underscore is used
>> instead
>>> of
>>>>>>>>> dash.
>>>>>>>>>>>
>>>>>>>>>>> Cheers
>>>>>>>>>>>
>>>>>>>>>>> On Sun, Apr 1, 2018 at 9:38 AM, Boyang Chen <
>> bche...@outlook.com
>>>>
>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hey friends,
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I would like to start a discussion thread for KIP 276:
>>>>>>>>>>>>
>>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>>>>>>>> 276+Add+StreamsConfig+prefix+for+different+consumers
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> And pull request is here:
>>>>>>>>>>>>
>>>>>>>>>>>> https://github.com/apache/kafka/pull/4805
>>>>>>>>>>>>
>>>>>>>>>>>> [https://avatars3.githubusercontent.com/u/5845561?s=400&v=4
>>>>>>>> ]<https://
>>>>>>>>>>>> github.com/apache/kafka/pull/4805>
>>>>>>>>>>>>
>>>>>>>>>>>> KAFKA-6657: Add StreamsConfig prefix for different consumers
>> by
>>>>>>>>> abbccdda
>>>>>>>>>>> ·
>>>>>>>>>>>> Pull Request #4805 · apache/kafka<https://github.
>>>>>>>>>>>> com/apache/kafka/pull/4805>
>>>>>>>>>>>> github.com
>>>>>>>>>>>> This pull request is for jira 6657. The KIP proposal is here
>>> Added
>>>>>>>> unit
>>>>>>>>>>>> tests for new getGlobalConsumerConfigs API and make sure
>>> existing
>>>>>>>>> restore
>>>>>>>>>>>> consumer tests are passing.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>
>>>>>>>>>>>> Boyang
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> -- Guozhang
>>>
>>
> 
> 
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to