如何使用KCL确定特定分区键的分片ID?

时间:2015-08-08 12:47:40

标签: amazon-web-services amazon-kinesis

PutRequest API使用分区键来确定记录的分片ID。即使PutRequest的响应包含分片ID,它也不可靠,因为分片是可分割的,因此记录可能会移动到新的分片。我找不到一种方法来确定消费者端特定分区键的分片ID。

似乎AWS将分区键映射到128位整数键,但文档中没有解释散列算法。我想要做的是处理具有特定分区键的Kinesis流中的记录,这意味着它们将位于特定分片中,以便我可以只获取特定分片中的数据但我找不到合适的API在文档中。

1 个答案:

答案 0 :(得分:7)

根据文档,使用的散列算法是MD5。

  

MD5哈希函数用于将分区键映射到128位整数值,并使用分片的哈希键范围将关联的数据记录映射到分片。

请参阅http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html

在您的情况下,如果您知道要为其识别相应分片的分区键,则需要执行以下两项操作:

  1. 计算分区键的MD5哈希值
  2. 浏览分片列表以查找其散列键范围包含第一步中计算的散列值的分片。
  3. 这里有一些代码片段可以帮助您:

    MD5 Hash as BigInteger

    $location = WSDL_LINK;
    $opts = array(
        'http'=>array(
            'user_agent' => 'PHPSoapClient'
            )
        );
    $context = stream_context_create($opts);
    $client = new SoapClient($location, array("trace" => true, 'exceptions' => 1, 'stream_context' => $context,
                                              'cache_wsdl' => WSDL_CACHE_NONE, 'soap_version' => SOAP_1_1, 'connection_timeout' => 120));
    
    $result = $client->GetTransactionStatus(array(
                        'TxnReferenceNo'=>$transaction_unique_id
                    ));
    highlight_string($client->__getLastRequest());
    

    查找分区键的分片

    String partitionKey = "YourKnownKey";
    byte[] partitionBytes = partitionKey.getBytes("UTF-8");
    byte[] hashBytes = MessageDigest.getInstance("MD5").digest(partitionBytes);
    BigInteger biPartitionKey = new BigInteger(1, hashBytes);
    

    如果您分割和/或合并分片,事情会变得复杂一些。以上假设您只存在活动分片。