分区(或哈希)键:从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个碎片(最佳平衡)。
这也解释了流上的合并和拆分操作。
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具有相同分区键范围的新记录将放置在Shard-31或Shard-32下。
发送数据到Kinesis(即生产者端)时,您不需要担心“数据会被分配到哪个分片中”。发送一个随机数(或uuid或当前时间戳,以毫秒为单位)是为了使数据在分片上有效地进行扩展和分发。除非您担心在单个分片中记录的顺序,否则最好选择一个随机数/不断变化的分区键来发出put_record请求。
在Java中,您可以使用“putRecordsRequestEntry.setPartitionKey(Long.toString(System.currentTimeMillis()))
”或“putRecordRequest.setPartitionKey(Long.toString(System.currentTimeMillis()))
”作为示例。
这完全取决于使用情况。你需要确保所有相关数据进入一个单独的分片,这样如果需要为一个键聚合数据,就可以实现。
如果你没有这个要求,使用任何随机键都应该是可以的。