2015-07-10 33 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

這完全取決於用例。 您需要確保所有相關數據都歸入單個分片,以便您可以根據需要彙總數據。

如果你沒有這個要求使用任何隨機密鑰應該沒問題。