2015-07-10 36 views
11

在生产者 - 消费者网络应用程序中,应该如何为Kinesis流分片创建分区键。 假设我有一个有16个分片的kinesis流,我应该创建多少个分区键?它真的取决于碎片的数量吗?如何确定AWS kinesis流中的分区键的总数量?

+0

看看这个问题,也许它有帮助; http://stackoverflow.com/a/31377161/1622134 – az3

回答

22

分区(或哈希)键:开始从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个碎片(最佳平衡)。

这也解释了流上的合并和拆分操作。

  • 要合并2个碎片,它们应该覆盖相邻的散列键。你不能合并碎片03和碎片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

见,碎片-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()))”作为示例。

+3

我们遇到** timestamp **的不好的情况。由于分区键不能按预期的方式工作,因此当前时间戳差异为毫秒。因此,我们用** uuid **来改变它。 –

1

这完全取决于用例。 您需要确保所有相关数据都归入单个分片,以便您可以根据需要汇总数据。

如果你没有这个要求使用任何随机密钥应该没问题。