org.apache.kafka.clients.consumer.internals.PartitionAssignor Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.kafka.clients.consumer.internals;
import org.apache.kafka.common.Cluster;
import org.apache.kafka.common.TopicPartition;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* This interface is used to define custom partition assignment for use in
* {@link org.apache.kafka.clients.consumer.KafkaConsumer}. Members of the consumer group subscribe
* to the topics they are interested in and forward their subscriptions to a Kafka broker serving
* as the group coordinator. The coordinator selects one member to perform the group assignment and
* propagates the subscriptions of all members to it. Then {@link #assign(Cluster, Map)} is called
* to perform the assignment and the results are forwarded back to each respective members
*
* In some cases, it is useful to forward additional metadata to the assignor in order to make
* assignment decisions. For this, you can override {@link #subscription(Set)} and provide custom
* userData in the returned Subscription. For example, to have a rack-aware assignor, an implementation
* can use this user data to forward the rackId belonging to each member.
*
* This interface has been deprecated in 2.4, custom assignors should now implement
* {@link org.apache.kafka.clients.consumer.ConsumerPartitionAssignor}. Note that maintaining compatibility
* for an internal interface here is a special case, as {@code PartitionAssignor} was meant to be a public API
* although it was placed in the internals package. Users should not expect internal interfaces or classes to
* not be removed or maintain compatibility in any way.
*/
@Deprecated
public interface PartitionAssignor {
/**
* Return a serializable object representing the local member's subscription. This can include
* additional information as well (e.g. local host/rack information) which can be leveraged in
* {@link #assign(Cluster, Map)}.
* @param topics Topics subscribed to through {@link org.apache.kafka.clients.consumer.KafkaConsumer#subscribe(java.util.Collection)}
* and variants
* @return Non-null subscription with optional user data
*/
Subscription subscription(Set topics);
/**
* Perform the group assignment given the member subscriptions and current cluster metadata.
* @param metadata Current topic/broker metadata known by consumer
* @param subscriptions Subscriptions from all members provided through {@link #subscription(Set)}
* @return A map from the members to their respective assignment. This should have one entry
* for all members who in the input subscription map.
*/
Map assign(Cluster metadata, Map subscriptions);
/**
* Callback which is invoked when a group member receives its assignment from the leader.
* @param assignment The local member's assignment as provided by the leader in {@link #assign(Cluster, Map)}
*/
void onAssignment(Assignment assignment);
/**
* Callback which is invoked when a group member receives its assignment from the leader.
* @param assignment The local member's assignment as provided by the leader in {@link #assign(Cluster, Map)}
* @param generation The consumer group generation associated with this partition assignment (optional)
*/
default void onAssignment(Assignment assignment, int generation) {
onAssignment(assignment);
}
/**
* Unique name for this assignor (e.g. "range" or "roundrobin" or "sticky")
* @return non-null unique name
*/
String name();
class Subscription {
private final List topics;
private final ByteBuffer userData;
public Subscription(List topics, ByteBuffer userData) {
this.topics = topics;
this.userData = userData;
}
public Subscription(List topics) {
this(topics, ByteBuffer.wrap(new byte[0]));
}
public List topics() {
return topics;
}
public ByteBuffer userData() {
return userData;
}
@Override
public String toString() {
return "Subscription(" +
"topics=" + topics +
')';
}
}
class Assignment {
private final List partitions;
private final ByteBuffer userData;
public Assignment(List partitions, ByteBuffer userData) {
this.partitions = partitions;
this.userData = userData;
}
public Assignment(List partitions) {
this(partitions, ByteBuffer.wrap(new byte[0]));
}
public List partitions() {
return partitions;
}
public ByteBuffer userData() {
return userData;
}
@Override
public String toString() {
return "Assignment(" +
"partitions=" + partitions +
')';
}
}
}