PutRequest
API使用分区键来确定记录的分片ID。即使PutRequest
的响应包含分片ID,它也不可靠,因为分片是可分割的,因此记录可能会移动到新的分片。我找不到一种方法来确定消费者端特定分区键的分片ID。
似乎AWS将分区键映射到128位整数键,但文档中没有解释散列算法。我想要做的是处理具有特定分区键的Kinesis流中的记录,这意味着它们将位于特定分片中,以便我可以只获取特定分片中的数据但我找不到合适的API在文档中。
答案 0 :(得分:7)
根据文档,使用的散列算法是MD5。
MD5哈希函数用于将分区键映射到128位整数值,并使用分片的哈希键范围将关联的数据记录映射到分片。
请参阅http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html
在您的情况下,如果您知道要为其识别相应分片的分区键,则需要执行以下两项操作:
这里有一些代码片段可以帮助您:
$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);
如果您分割和/或合并分片,事情会变得复杂一些。以上假设您只存在活动分片。