2017-07-24 18 views
2

我有點困惑的AWS文檔爲把記錄的Kinesis流在這裏:https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html#API_PutRecord_RequestSyntax使用Java SDK將記錄放入Kinesis流時,sequenceNumberForOrdering做了什麼?

它說,設置sequenceNumberForOrdering應該用於保障秩序「來自同一客戶和同一分區鍵看跌期權」 。在this page最底部

的例子是什麼讓我困惑:

  1. 應該是什麼在例如可變 sequenceNumberOfPreviousRecord的初始值? "0"
  2. 爲什麼它似乎不關心上一個記錄被放入哪個分區鍵? (示例中的循環放置兩個不同的分區鍵0和1的記錄。)

也許我只是不明白它,但我認爲文檔可以更好地解釋這一點。

回答

0

這是一個奇怪的不完整的例子。不顯示或討論如何初始化sequenceNumberOfPreviousRecordin。我在aws論壇發現了一個slightly better example,顯然使用的起始序號是null

String sequenceNumberOfPreviousRecord = null; 
for (int j = 0; j < 200; j++) { 
    PutRecordRequest putRecordRequest = new PutRecordRequest(); 
    putRecordRequest.setStreamName(myStreamName); 
    putRecordRequest.setData(ByteBuffer.wrap(String.format("%s-%d",testData, 200+j).getBytes())); 
    putRecordRequest.setPartitionKey(String.format("partitionKey-%d", j/5)); 
    putRecordRequest.setSequenceNumberForOrdering(sequenceNumberOfPreviousRecord); 
    PutRecordResult putRecordResult = kinesisClient.putRecord(putRecordRequest); 
    sequenceNumberOfPreviousRecord = putRecordResult.getSequenceNumber(); 

    System.out.println("Successfully putrecord, partition key : " + putRecordRequest.getPartitionKey() 
     + ", Data : " + String.format("%s-%d",testData, 200+j) 
     + ", SequenceNumber : " + putRecordResult.getSequenceNumber() 
    ); 
} 

你的例子對分區鍵的使用也很奇怪。除非分區密鑰的分佈非常不均勻,否則密鑰0和1很可能會在同一個分區中結束。在大多數情況下,您最好使用隨機uuid來確保在您的分片中分發傳入記錄。

+0

那麼我的第二個問題呢?應該將循環中的記錄的setSequenceNumberForOrdering設置爲循環中上一條記錄的序列號還是具有相同分區鍵的最後一條記錄?鏈接的例子將分區鍵設置爲一個常量值。 – EagleBeak

相關問題