可以使用Kinesis API动态添加/删除碎片。此外,Kinesis流数据Producer需要设置正确的分区键" (在我的PutRecord API调用中,它似乎最好地映射到碎片)。因此,您的数据生产者似乎也需要了解动态扩展,以便利用新分片或停止发送到已删除的分片。
问题:我的数据生产者如何动态跟踪特定流上可用的分片数,并创建分区键以匹配它们?
答案 0 :(得分:0)
生产者应该按照您在重新分片过程中所说的方式工作。
据我所知,kafka在client api本身中保留了分区信息的映射
public final class Cluster {
private final Map<TopicPartition, PartitionInfo> partitionsByTopicPartition;
private final Map<String, List<PartitionInfo>> availablePartitionsByTopic;
// ...
}
并在每个send(message, partitionKey)
上获取活动分区的数量以计算分区。请参阅DefaultPartitioner
public class DefaultPartitioner implements Partitioner {
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
// ...
}
}
虽然, kinesis client只需要参数partitionKey
,我想一旦将记录信息发送到kinesis服务器,就会确定它应该去的确切分区基于与多少个分片处于活动状态相同的逻辑。因此,我认为计算kinesis partition / shard对客户端api是隐藏的。