如何确定 AWS kinesis 流中的分区键总数?
Posted
技术标签:
【中文标题】如何确定 AWS kinesis 流中的分区键总数?【英文标题】:How to decide total number of partition keys in AWS kinesis stream? 【发布时间】:2015-09-29 15:58:18 【问题描述】:在生产者-消费者 Web 应用程序中,为 kinesis 流分片创建分区键的思考过程应该是什么。 假设我有一个包含 16 个分片的 kinesis 流,我应该创建多少个分区键?真的取决于分片的数量吗?
【问题讨论】:
看看这个问题,也许有帮助; ***.com/a/31377161/1622134 【参考方案1】:分区(或哈希)键:从 1 到 340282366920938463463374607431768211455。假设为 ~34020 * 10^34,为方便起见,我将省略 10^34...
如果你有 30 个分片,均匀划分,每个分片应该覆盖 1134 * 10^34 个哈希键。覆盖范围应该是这样的。
Shard-00: 0 - 1134
Shard-01: 1135 - 2268
Shard-03: 2269 - 3402
Shard-04: 3403 - 4536
...
Shard-28: 30619 - 31752
Shard-29: 31753 - 32886
Shard-30: 32887 - 34020
如果您有 3 个消费者应用程序(监听这 30 个分片),每个应该监听 10 个分片(最佳平衡)。
这也解释了 Stream 上的 Merge 和 Split 操作。
要合并 2 个分片,它们应该覆盖相邻的哈希键。您不能合并 Shard-03 和 Shard-29。 您可以拆分任何分片。如果中间拆分shard-00,分布是这样的;
Shard-31: 0 - 567
Shard-32: 568 - 1134
Shard-01: 1135 - 2268
Shard-03: 2269 - 3402
Shard-04: 3403 - 4536
...
Shard-28: 30619 - 31752
Shard-29: 31753 - 32886
Shard-30: 32887 - 34020
看,Shard-00 将不再接受新数据。放入具有相同分区键范围(如 Shard-00)的 Kinesis 流中的新记录将放在 Shard-31 或 Shard-32 下。
在将数据发送到 Kinesis(即生产者端)时,您不必担心“数据流向哪个分片”。发送一个随机数(或 uuid,或以毫秒为单位的当前时间戳)最适合在分片上有效地扩展和分布数据。除非您担心单个分片中记录的顺序,否则最好为 put_record 请求选择一个随机数/不断变化的分区键。
在 Java 中,您可以使用“putRecordsRequestEntry.setPartitionKey(Long.toString(System.currentTimeMillis()))
”或“putRecordRequest.setPartitionKey(Long.toString(System.currentTimeMillis()))
”作为示例。
【讨论】:
我们遇到了 timestamp 的糟糕情况。以毫秒为单位,当前时间戳作为分区键不能按预期工作。因此,我们将其更改为 uuid。 请注意,为每条消息创建 uuid 可能会耗费时间(和熵)。 谢谢,为我工作@az3。我的 kinesis 流有 32 个分片并且运行良好。【参考方案2】:这完全取决于用例。 您只需要确保所有相关数据都进入单个分片,以便您可以在需要时为密钥聚合数据。
如果你没有这个要求,使用任何随机密钥应该没问题。
【讨论】:
以上是关于如何确定 AWS kinesis 流中的分区键总数?的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Kinesis Streams - 每个分片有多个“主题”?
AWS CDK 中的哪个类可以选择为 Kinesis 传输流配置动态分区
Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中