我正在阅读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,但不明白它的意思。
答案 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之前。
分片“流”功能在许多情况下很有用。
(例如,视频服务使用用户名和电影名称作为分区键将电影流式传输给用户)。
(例如,处理一系列常见事件并应用汇总)。
在不需要排序(流式传输)或分组(例如聚合)的情况下,生成随机分区密钥就足够了。