使用Java SDK将记录放入Kinesis流时,sequenceNumberForOrdering到底能做什么?

Eag*_*eak 5 java amazon-web-services amazon-kinesis aws-sdk

我对将文档放入Kinesis流中的AWS文档有些困惑:https : //docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html#API_PutRecord_RequestSyntax

它说sequenceNumberForOrdering应该使用设置来保证“从同一客户端到同一分区键的订单”的顺序。

此页面底部的示例让我感到困惑:

  1. sequenceNumberOfPreviousRecord在该示例中,变量的初始值应该是什么 ?"0"
  2. 为什么以前的记录放在哪个分区键似乎无关紧要?(示例中的循环放置两个不同分区键0和1的记录。)

也许我只是听不懂,但是我认为文档可以更好地解释这一点。

RaG*_*aGe 4

这是一个奇怪的不完整的例子。不显示或讨论如何sequenceNumberOfPreviousRecordin初始化。我在 aws 论坛中找到了一个稍微更好的示例,显然要使用的起始序列号是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()
      );
}
Run Code Online (Sandbox Code Playgroud)

您的示例对分区键的使用也很奇怪。除非分区键的分布非常倾斜,否则键 0 和 1 很可能最终出现在同一个分片中。在大多数情况下,最好使用随机 uuid,以确保在分片中分配传入记录。