在生产者-消费者 Web 应用程序中,为 kinesis 流分片创建分区键的思考过程应该是什么。假设我有一个包含 16 个分片的 kinesis 流,我应该创建多少个分区键?它真的取决于分片的数量吗?
2 回答
分区(或哈希)键:从 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()))
" 可以是例子。
这完全取决于用例。您只需要确保所有相关数据都进入单个分片,以便您可以在需要时为键聚合数据。
如果您没有该要求,则使用任何随机密钥都可以。