Feyman, some more comments/questions:
The description of `LeaveGroupRequest` is clear but it's unclear how `MemberToRemove` should behave. Which parameter is required? Which is optional? What is the relationship between both. The `LeaveGroupRequest` description clearly states that specifying a `memberId` is optional if the `groupInstanceId` is provided. If `MemberToRemove` applies the same pattern, it must be explicitly defined in the KIP (and explained in the JavaDocs of `MemberToRemove`) because we cannot expect that an admin-client users knows that internally a `LeaveGroupRequest` is used nor what the semantics of a `LeaveGroupRequest` are. About Admin API: In general, I am also confused that we allow so specify a `memberId` at all, because the `memberId` is an internal id that is not really exposed to the user. Hence, from a AdminClient point of view, accepting a `memberId` as input seems questionable to me? Of course, `memberId` can be collected via `describeConsumerGroups()` but it will return the `memberId` of _all_ consumer in the group and thus how would a user know which member should be removed for a dynamic group (if an individual member should be removed)? Hence, how can any user get to know the `memberId` of an individual client in a programtic way? Also I am wondering in general, why the removal of single dynamic member is important? In general, I would expect a short `session.timeout` for dynamic groups and thus removing a specific member from the group seems not to be an important feature -- for static groups we expect a long `session.timeout` and a user can also identify individual clients via `groupInstandId`, hence the feature makes sense for this case and is straight forward to use. About StreamsResetter: For this case we just say "remove all members" and thus the `describeConsumerGroup` approach works. However, it seems to be a special case? Or, if we expected that the "remove all members" use case is the norm, why can't we make a change admin-client to directly accept a `group.id`? The admin-client can internal first do a `DescribeGroupRequest` and afterward corresponding `LeaveGroupRequest` -- i.e., instead of building this pattern in `StreamsResetter` we build it directly into `AdminClient`. Last, for static group the main use case seems to be to remove an individual member from the group but this feature is not covered by the KIP: I think using `--force` to remove all members makes sense, but an important second feature to remove an individual static member would require it's own flag to specify a single `group.instance.id`. Thoughts? -Matthias On 3/11/20 8:43 PM, feyman2009 wrote: > Hi, Sophie > For 1) Sorry, I found that my expression is kind of misleading, what I actually mean is: "if --force not specified, an exception saying there are still active members on broker side will be thrown and suggesting using StreamsResetter with --force", I just updated the KIP page. > > For 2) > I may also had some misleading expression previous, to clarify : > > Also, it's more efficient to just send a single "clear the group" request vs sending a LeaveGroup > request for every single member. What do you think? > => the comparison is to send a single "clear the group" request vs sending a "get members" + a "remove members" request since the adminClient.removeMembersFromConsumerGroup support batch removal. We don't need to send lots of leaveGroup requests for every single member. > > I can understand your point, but I think we could reuse the current > adminClient.removeMembersFromConsumerGroup interface effectively with the KIP. > What do you think? > > Thanks! > > Feyman > > > ------------------------------------------------------------------ > 发件人:Sophie Blee-Goldman <sop...@confluent.io> > 发送时间:2020年3月10日(星期二) 03:02 > 收件人:dev <dev@kafka.apache.org>; feyman2009 <feyman2...@aliyun.com> > 主 题:Re: 回复:回复:[Vote] KIP-571: Add option to force remove members in StreamsResetter > > Hey Feyman, > > 1) Regarding point 2 in your last email, if I understand correctly you propose to change > the current behavior of the reset tool when --force is not specified, and wait for (up to) > the session timeout for all members to be removed. I'm not sure we should change this, > especially now that we have a better way to handle the case when the group is not empty: > we should continue to throw an exception and fail fast, but can print a message suggesting > to use the new --force option to remove remaining group members. Why make users wait > for the session timeout when we've just added a new feature that means they don't have to? > > 2) Regarding Matthias' question: > >> I am really wondering, if for a static group, we should allow users toremove individual members? For a dynamic group this feature would not > make much sense IMHO, because the `memberId` is not know by the user. > > I think his point is similar to what I was trying to get at earlier, with the proposal to add a new > #removeAllMembers API rather than an API to remove individual members according to their > memberId. As he explained, removing based on memberId is likely not that useful in general. > Also, it's not actually what we want to do here; maybe we should avoid adding a new API > that we think may be useful in other contexts (remove individual member based on memberId), > and just add the API we actually need (remove all members from group) in this KIP? We can > always add the "remove individual member by memberId" API at a later point, if it turns out to > actually be requested for specific reasons? > > Also, it's more efficient to just send a single "clear the group" request vs sending a LeaveGroup > request for every single member. What do you think? > > > > > On Sat, Mar 7, 2020 at 1:41 AM feyman2009 <feyman2...@aliyun.com.invalid> wrote: > Hi, Matthias > Thanks, I updated the KIP to mention the deprecated and newly added methods. > > 1. What happens is `groupInstanceId` is used for a dynamic group? What > happens if both parameters are specified? What happens if `memberId` > is specified for a static group? > > => my understanding is that the dynamic/static membership is member level other than group level, and I think above questions could be answered by the "Leave Group Logic Change" section in KIP-345: https://cwiki.apache.org/confluence/display/KAFKA/KIP-345%3A+Introduce+static+membership+protocol+to+reduce+consumer+rebalances, this KIP stays consistent with KIP-345. > > 2. About the `--force` option. Currently, StreamsResetter fails with an > error if the consumer group is not empty. You state in your KIP that: > > > without --force, we need to wait for session timeout. > > Is this an intended behavior change if `--force` is not used or is the > KIP description incorrect? > > => This is the intended behavior. For this part, I think there are two ways to go: > 1) (the implicit way) Not introducing the new "--force" option, with this KIP, StreamsResetter will by default remove active members(with long session timeout configured) on broker side > 2) (the explicit way) Introduce the new "--force" option, users need to explicitly specify --force to remove the active members. If --force not specified, the StreamsResetter behaviour is as previous versions'. > > I think the two alternatives above are both feasible, personally I prefer way 2. > > 3. For my own understanding: with the `--force` option, we intend to get > all `memberIds` and send a "remove member" request for each with > corresponding `memberId` to remove the member from the group > (independent is the group is static or dynamic)? > > => Yeah, minor thing to mention is we will send the "remove member" request for each member(could be dynamic member or static member) to remove them from group > for dynamic members, both "group.instance.id" and "member.id" will be specified > for dynamic members, only "member.id" will be specified > > 4. I am really wondering, if for a static group, we should allow users to > remove individual members? For a dynamic group this feature would not > make much sense IMHO, because the `memberId` is not know by the user. > > => KIP-345 introduced the batch removal feature for both static member and dynamic member, my understanding is that "allow users to > remove individual members" could be useful for rolling bounce and scale down accoding to KIP-345. KafkaAdminClient currently only support static member removal and this KIP-571 enables dynamic member removal for it, which is also consistent with the broker side logic. Users could get the member.id (and group.instance.id if for static member) by adminClient.describeConsumerGroups. > > Furthermore, I don't have an assumption that a consumer group should contain only static or dynamic members, and I think KIP-345 and this KIP don't need to be based on this assumption. > You could correct me if I have the wrong understanding :) > > Thanks! > Feyman > > > > > > > > ------------------------------------------------------------------ > 发件人:Matthias J. Sax <mj...@apache.org> > 发送时间:2020年3月6日(星期五) 02:20 > 收件人:dev <dev@kafka.apache.org> > 主 题:Re: 回复:回复:[Vote] KIP-571: Add option to force remove members in StreamsResetter > > Feyman, > > thanks a lot for the KIP. Overall LGTM. I have a few more comment and > questions (sorry for the late reply): > > > The KIP mentions that some constructors will be deprecated. Those should > be listed explicitly. For example: > > > public class MemberToRemove { > > // deprecated methods > > @Deprecated > public MemberToRemove(String groupInstanceId); > > // new methods > > public MemberToRemove() > > public MemberToRemove withGroupInstanceId(String groupInstanceId) > > public MemberToRemove withMemberId(String memberId) > } > > What happens is `groupInstanceId` is used for a dynamic group? What > happens if both parameters are specified? What happens if `memberId` > is specified for a static group? > > > About the `--force` option. Currently, StreamsResetter fails with an > error if the consumer group is not empty. You state in your KIP that: > >> without --force, we need to wait for session timeout. > > Is this an intended behavior change if `--force` is not used or is the > KIP description incorrect? > > For my own understanding: with the `--force` option, we intend to get > all `memberIds` and send a "remove member" request for each with > corresponding `memberId` to remove the member from the group > (independent is the group is static or dynamic)? > > I am really wondering, if for a static group, we should allow users to > remove individual members? For a dynamic group this feature would not > make much sense IMHO, because the `memberId` is not know by the user. > > > > -Matthias > > > On 3/5/20 7:15 AM, Bill Bejeck wrote: >> Thanks for the KIP. +1 (binding). > >> -Bill > > > >> On Wed, Mar 4, 2020 at 12:40 AM Guozhang Wang <wangg...@gmail.com> >> wrote: > >>> Thanks, +1 from me (binding). >>> >>> On Tue, Mar 3, 2020 at 9:39 PM feyman2009 <feyman2...@aliyun.com> >>> wrote: >>> >>>> Hi, Guozhang Thanks a lot for the advice, that make sense! I >>>> have updated the KIP page with the operational steps of >>>> StreamsResetter. >>>> >>>> Thanks! Feyman >>>> >>>> ------------------------------------------------------------------ >>>> >>>> > 发件人:Guozhang Wang <wangg...@gmail.com> >>>> 发送时间:2020年3月3日(星期二) 14:22 收件人:dev <dev@kafka.apache.org>; >>>> feyman2009 <feyman2...@aliyun.com> 主 题:Re: 回复:回复:[Vote] >>>> KIP-571: Add option to force remove members in StreamsResetter >>>> >>>> Hello Feyman, thanks for the proposal! >>>> >>>> I read through the doc and overall it looks good to me. >>>> >>>> One minor thing I'd still like to point out is that, the >>>> "removeMembersFromConsumerGroup" only sends a leave-group >>>> request to the coordinator to let it remove the member, >>>> however, if the member is still there alive and running then it >>>> would soon be notified that it is no >>> longer >>>> a legal member of the group via heartbeats, and then >>>> automatically tries >>> to >>>> re-join the group. So on the operational side, it is still >>>> required that the following steps: >>>> >>>> 1) first stop the consumers (of streams instances), wait until >>>> the shutdown is complete. 2) then use admin client in case the >>>> stopped consumers are still registered at the broker side and >>>> we do not want to wait for session timeout. >>>> >>>> Even with this KIP, people should still not skip step 1) above, >>>> since otherwise the consumers would re-connect and re-join the >>>> group >>> immediately >>>> still. >>>> >>>> In your doc you've already mentioned "Furthermore, users should >>>> make sure all the stream applications are shutdown when running >>>> StreamsResetter >>> with >>>> --force, otherwise it might trigger unexpected rebalance. " >>>> What I'd want to clarify is that no matter if "--force" option >>>> is enabled, this is >>> always >>>> the case that users should shutdown the streams instances >>>> first, and then use the streams resetter :) >>>> >>>> As long as that is clarified in the proposal documentation, I'm >>>> +1 on >>> this >>>> KIP. >>>> >>>> >>>> Thanks again for the contribution, Guozhang >>>> >>>> >>>> On Mon, Mar 2, 2020 at 6:31 AM feyman2009 >>>> <feyman2...@aliyun.com.invalid >>>> >>>> wrote: Hi, John Sorry, I have mistaken the KIP approval >>>> standard, anyway, I will >>> start >>>> the PR soon and waiting for more binding approvals. >>>> >>>> Thanks! Feyman >>>> >>>> >>>> ------------------------------------------------------------------ >>>> >>>> > 发件人:John Roesler <vvcep...@apache.org> >>>> 发送时间:2020年3月2日(星期一) 22:00 收件人:dev > <dev@kafka.apache.org> 主 >>>> 题:Re: 回复:回复:[Vote] KIP-571: Add option to force remove members >>>> in StreamsResetter >>>> >>>> Hi Feyman, >>>> >>>> Sorry, but we actually need 3 binding votes for the KIP to >>>> pass. Please feel free to keep bumping the thread until some >>>> more committers can take >>> a >>>> look. >>>> >>>> By the way, you can totally start a PR, but we can’t merge it >>>> until the KIP passes the vote. >>>> >>>> Thanks! John >>>> >>>> On Mon, Mar 2, 2020, at 00:24, feyman2009 wrote: >>>>> Hi,all Since currently we have 1 binding and two non-binding >>>>> +1, I will update the KIP-571 as adopted and initiate a PR >>>>> shortly >>>>> >>>>> Thanks! Feyman >>>>> >>>>> >>>>> ------------------------------------------------------------------ >>>>> >>>>> > 发件人:Sophie Blee-Goldman <sop...@confluent.io> >>>>> 发送时间:2020年2月28日(星期五) 10:17 收件人:dev > <dev@kafka.apache.org> 主 >>>>> 题:Re: 回复:[Vote] KIP-571: Add option to force remove members >>>>> in >>>> StreamsResetter >>>>> >>>>> Thanks for the KIP, +1 (non-binding) >>>>> >>>>> On Thu, Feb 27, 2020 at 12:40 PM Boyang Chen < >>> reluctanthero...@gmail.com >>>>> >>>>> wrote: >>>>> >>>>>> Thanks Feyman, +1 (non-binding) >>>>>> >>>>>> On Thu, Feb 27, 2020 at 9:25 AM John Roesler >>>>>> <vvcep...@apache.org> >>>> wrote: >>>>>> >>>>>>> Thanks for the proposal! >>>>>>> >>>>>>> I'm +1 (binding) -John >>>>>>> >>>>>>> On Wed, Feb 26, 2020, at 19:41, feyman2009 wrote: >>>>>>>> Updated with the KIP link: >>>>>>>> >>>>>>> >>>>>> >>>> >>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-571%3A+Add+opti > on+to+force+remove+members+in+StreamsResetter >>>>>>>> >>>>>>>> >>>>>>>> >>> >>> > ------------------------------------------------------------------ >>>>>>>> 发件人:feyman2009 <feyman2...@aliyun.com.INVALID> 发送时 >>>>>>>> 间:2020年2月27日(星期四) 09:38 收件人:dev <dev@kafka.apache.org> >>>>>>>> 主 题:[Vote] KIP-571: Add option to force remove members >>>>>>>> in >>>>>> StreamsResetter >>>>>>>> >>>>>>>> >>>>>>>> Hi, all I would like to start a vote on KIP-571: Add >>>>>>>> option to force >>>> remove >>>>>>>> members in StreamsResetter . >>>>>>>> >>>>>>>> Thanks! Feyman >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> -- -- Guozhang >>>> >>>> >>>> >>> >>> -- -- Guozhang >>> > > >
signature.asc
Description: OpenPGP digital signature