AWS Kinesis中的分区键是什么?

时间:2018-01-23 10:52:44

标签: node.js amazon-web-services stream amazon-kinesis

我正在阅读AWS Kinesis。在以下程序中,我将数据写入名为TestStream的流中。我运行了这段代码10次,在流中插入了10条记录。

var params = {
    Data: 'More Sample data into the test stream ...',
    PartitionKey: 'TestKey_1',
    StreamName: 'TestStream'
};

kinesis.putRecord(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
});

所有记录都已成功插入。 partition key在这里真正意味着什么?它在后台做什么?我读了documentation,但不明白它的意思。

2 个答案:

答案 0 :(得分:26)

分区键仅在流中有多个分片时才会起作用(但总是需要它们)。 Kinesis计算分区键的MD5哈希,以决定存储记录的分片(如果您描述了流,您将看到哈希值作为分片描述的一部分)。

那为什么这很重要?

每个分片只能接受1,000条记录和/或每秒1 MB(请参阅PutRecord doc)。如果您以比此速率更快的速度写入单个分片,则会获得ProvisionedThroughputExceededException

使用多个分片时,可以缩放此限制:4个分片可为您提供4,000条记录和/或每秒4 MB。当然,有一些警告。

最大的是你必须使用不同的分区键。如果您的所有记录都使用相同的分区键,那么您仍然会写入一个分片,因为它们都具有相同的哈希值。如何解决这个问题取决于您的应用程序:如果您是从多个进程编写的,那么使用进程ID,服务器的IP地址或主机名就足够了。如果您是从单个进程编写的,则可以使用记录中的信息(例如,唯一的记录ID)或生成随机字符串。

第二个警告是分区键计入总写入大小,并存储在流中。因此,虽然你可能通过在记录中使用一些文本组件来获得良好的随机性,但你会浪费空间。另一方面,如果您有一些随机文本组件,您可以从中计算自己的哈希值,然后将其用于分区键。

最后,如果您正在使用PutRecords(如果您正在编写大量数据,则应该使用{}},请求中的个别记录可能会被拒绝,而其他记录则会被接受。发生这种情况是因为那些记录进入了一个已经达到写入限制的分片,你必须重新发送它们(延迟之后)。

答案 1 :(得分:10)

可接受的答案说明什么是分区键以及它们在Kinesis中的用途(决定将数据发送到哪个分片)。不幸的是,它没有解释为什么首先需要分区键。

理论上,AWS可以为每个记录创建一个随机分区键,这将导致几乎完美的传播。

使用分区的真正原因是为了“排序/流式传输”。 Kinesis维护每个分片的排序(序列号)。

换句话说,通过将X以及随后的Y传输到分片Z,可以确保X将在Y之前(从所有分片中提取记录时)从流中被提取。 另一方面,将X流传输到分片Z1,然后将Y流传输到分片Z2,则不能保证排序(从所有分片中提取记录时)。肯定可以将Y拉到X之前。

分片“流”功能在许多情况下很有用。

(例如,视频服务使用用户名和电影名称作为分区键将电影流式传输给用户)。

(例如,处理一系列常见事件并应用汇总)。

在不需要排序(流式传输)或分组(例如聚合)的情况下,生成随机分区密钥就足够了。