为什么我的Kinesis流只配置了3个shardIds,却出现了这么多?

0

【以下的问题经过翻译处理】 我有一个Kinesis消费者代码,它执行DescribeStream,然后针对每个ShardId启动一个新的Java线程来消费每个Shard。我在Stream中仅配置了3个Shard,但我得到了8个ShardId,为什么会这样?我不想有额外的5个线程不断消费并获取零记录。您可以看到,我正记录每个Shard上处理的记录总数。 ‘‘’ 2020-11-19 08:59:49 INFO GetRecords:109 - # Kinesis consumers: 8 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000000', Total Records: 0 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000001', Total Records: 0 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000002', Total Records: 0 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000003', Total Records: 19110 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000004', Total Records: 0 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000005', Total Records: 0 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000006', Total Records: 18981 2020-11-19 08:59:49 INFO GetRecords:112 - Kinesis - ShardId: 'shardId-000000000007', Total Records: 16195 ‘’’ 背景:我从1开始,然后配置为2,然后是3。这是否与其他具有0个记录的ShardId有关?如果是,那么忽略某种类型的Shard的推荐代码/实践是什么?

profile picture
专家
已提问 5 个月前13 查看次数
1 回答
0

【以下的回答经过翻译处理】 当您改变碎片的数量时,可能会使用update-shard-count API,Kinesis会负责合并和拆分单个碎片以达到您所需的碎片数。Kinesis中的记录是不可变的,除了在流程老化方面,需要能够按顺序读取。因此,您最终会得到一系列碎片。父碎片包含在给定哈希键范围内的所有记录,然后是两个子碎片,它们拆分该范围并继续进行新的记录。当创建这些子碎片时,父碎片不会消失,记录仍保留在该父碎片中,而子碎片开始接收新记录。当合并两个碎片时,这也是反向工作的。

当您进行describeStream调用时,shards列表中的每个碎片都将列出一个ParentShardId(如果有)。这使您可以构建一个族谱的映射,以在正确位置开始读取。如果您使用KCLLambda消费者,可以为您降低一些操作的复杂性。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则