如何在 AWS Kinesis 中使用 ExplicitHashKey 进行循环流分配

How to use ExplicitHashKey for round robin stream assignment in AWS Kinesis

我正在尝试通过 Amazon Kinesis 提取大量数据(每秒订购 10,000 个点)。

为了最大化通过我的分片的每秒记录数,我想在分片上循环我的请求(我的应用程序逻辑不关心单个消息去往哪个分片)。

我似乎可以使用 ExplicitHashKey 参数为我发送到 PutRecords 端点的列表中的消息执行此操作 - 但是亚马逊文档实际上并没有描述如何使用 ExplicitHashKey,除了:

http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html

Each record in the Records array may include an optional parameter, ExplicitHashKey, which overrides the partition key to shard mapping. This parameter allows a data producer to determine explicitly the shard where the record is stored. For more information, see Adding Multiple Records with PutRecords in the Amazon Kinesis Streams Developer Guide.

(上面文档中的语句对文档的另一部分有一个 link,它根本不讨论 ExplicitHashKeys)。

有没有办法使用 ExplicitHashKey 在分片之间循环数据?

参数的有效值是多少?

每个分片都分配有 128 位整数的连续范围,从 0 到 2^128 - 1。

您可以通过 AWS CLI 在流中找到分配给给定分片的整数范围:

aws kinesis describe-stream --stream-name name-of-your-stream

输出将如下所示:

{
    "StreamDescription": {
        "RetentionPeriodHours": 24, 
        "StreamStatus": "ACTIVE", 
        "StreamName": "name-of-your-stream", 
        "StreamARN": "arn:aws:kinesis:us-west-2:your-stream-info", 
        "Shards": [
           {
                "ShardId": "shardId-000000000113", 
                "HashKeyRange": {
                    "EndingHashKey": "14794885518301672324494548149207313541", 
                    "StartingHashKey": "0"
                }, 
                "ParentShardId": "shardId-000000000061", 
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49574208032121771421311268772132530603758174814974510866"
                }
            }, 
           { ... more shards ... }
       ...

您可以将记录的 ExplicitHashKey 设置为分片哈希键范围内任意位置整数值的字符串十进制表示形式,以强制将其发送到该特定分片。

请注意,由于之前对您的分片进行了合并和拆分操作,可能会有许多分片重叠 HashKeyRanges。当前打开的碎片是没有 SequenceNumberRange.EndingSequenceNumber 元素的碎片。

您可以通过在每个感兴趣的分片范围内识别一个 128 位整数来在一组分片之间循环请求,并将该数字的字符串表示形式分配给每个记录的 ExplicitHashKey .

作为旁注,您还可以计算给定 PartitionKey 将评估为的哈希值:

  1. 计算分区键的 MD5 和。
  2. 将 MD5 和解释为十六进制数并将其转换为基数 10。这将是该分区键的哈希键。然后,您可以查找该哈希键属于哪个分片。