[ https://issues.apache.org/jira/browse/KAFKA-6287?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jason Gustafson resolved KAFKA-6287. ------------------------------------ Resolution: Fixed > Inconsistent protocol type for empty consumer groups > ---------------------------------------------------- > > Key: KAFKA-6287 > URL: https://issues.apache.org/jira/browse/KAFKA-6287 > Project: Kafka > Issue Type: Bug > Components: consumer > Affects Versions: 1.0.0 > Reporter: Ryan Leslie > Assignee: Jason Gustafson > Priority: Minor > Fix For: 1.0.1 > > > When a consumer is created for a new group, the group metadata's protocol > type is set to 'consumer' and this is stored both in __consumer_offsets as > well as in the coordinator's local cache. > If the consumer leaves the group and the group becomes empty, ListGroups > requests will continue to show the group as type 'consumer', and as such > kafka-consumer-groups.sh will show it via --list. > However, if the coordinator (broker) node is killed and a new coordinator is > elected, when the GroupMetadataManager loads the group from > __consumer_offsets into its cache, it will not set the protocolType if there > are no active consumers. As a result, the group's protocolType will now > become the empty string (UNKNOWN_PROTOCOL_TYPE), and kafka-consumer-groups.sh > will no longer show the group. > Ideally bouncing a broker should not result in the group's protocol changing. > protocolType can be set in GroupMetadataManager.readGroupMessageValue() to > always reflect what's present in the persistent metadata (__consumer_offsets) > regardless if there are active members. > In general, things can get confusing when distinguishing between 'consumer' > and non-consumer groups. For example, DescribeGroups and OffsetFetchRequest > does not filter on protocol type, so it's possible for > kafka-consumer-groups.sh to describe groups (--describe) without actually > being able to list them. In the protocol guide, OffsetFetchRequest / > OffsetCommitRequest have their parameters listed as 'ConsumerGroup', but in > reality these can be used for groups of unknown type as well. For instance, a > consumer group can be copied by finding a coordinator > (GroupCoordinatorRequest / FindCoordinatorRequest) and sending an > OffsetCommitRequest. The group will be auto-created with an empty protocol. > Although this is arguably correct, the group will now exist but not be a > proper 'consumer' group until later when there is a JoinGroupRequest. Again, > this can be confusing as far as categorization / visibility of the group is > concerned. A group can instead be copied more directly by creating a consumer > and calling commitSync (as kafka-consumer-groups.sh), but this does involve > extra connections / requests and so is a little slower when trying to keep a > large number of groups in sync in real-time across clusters. > If we want to make it easier to keep consumer groups consistent, options > include allowing groups to be explicitly created with a protocol type instead > of only lazily, or for groups created outside of JoinGroupRequest the > coordinator can gain a broker config to set a default protocol type for > groups. This would default to 'consumer'. This sort of setting might be > confusing for users though, since implicitly created groups is certainly not > the norm. -- This message was sent by Atlassian JIRA (v7.6.3#76005)