Suh*_*pta 28 stream amazon-web-services node.js 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
});
Run Code Online (Sandbox Code Playgroud)
所有记录都已成功插入.partition key
这里到底意味着什么?它在后台做什么?我阅读了它的文档,但不明白它的含义.
kdg*_*ory 41
分区键仅在流中有多个分片时才起作用(但总是需要它们).Kinesis计算分区键的MD5哈希值,以决定存储记录的分片(如果您描述流,您将看到哈希值作为分片描述的一部分).
那为什么这很重要?
每个分片只能接受1,000条记录和/或每秒1 MB(请参阅PutRecord doc).如果你以比这个速度更快的速度写入一个分片,你就会得到一个ProvisionedThroughputExceededException
.
使用多个分片,您可以扩展此限制:4个分片可为您提供4,000条记录和/或每秒4 MB.当然,有一些警告.
最大的是你必须使用不同的分区键.如果您的所有记录都使用相同的分区键,那么您仍然会写入一个分片,因为它们都具有相同的哈希值.如何解决这个问题取决于您的应用程序:如果您是从多个进程编写的,那么使用进程ID,服务器的IP地址或主机名就足够了.如果你从一个单一的过程写那么您可以使用这记录中的信息(例如,唯一的记录ID)或生成一个随机字符串.
第二个警告是分区键计入总写入大小,并存储在流中.因此,虽然你可能通过在记录中使用一些文本组件来获得良好的随机性,但你会浪费空间.另一方面,如果您有一些随机文本组件,您可以从中计算自己的哈希值,然后将其用于分区键.
最后,如果您正在使用PutRecords(如果您正在编写大量数据,则应该使用PutRecords),请求中的个别记录可能会被拒绝,而其他记录则被接受.发生这种情况是因为这些记录转到已经处于其写入限制的分片,并且您必须重新发送它们(在延迟之后).
接受的答案说明了什么是分区键以及它们在Kinesis中的用途(决定将数据发送到哪个分片)。不幸的是,它没有解释为什么首先需要分区键。
理论上,AWS可以为每个记录创建一个随机分区键,这将导致近乎完美的传播。
使用分区的真正原因是为了“排序/流式传输”。Kinesis维护每个分片的排序(序列号)。
换句话说,通过将X流传输到分片Z,然后再将Y流传输到分片Z,可以保证X将在Y之前(从所有分片中提取记录时)从流中被拉出。另一方面,将X流传输到分片Z1,然后将Y流传输到分片Z2,则不能保证排序(从所有分片中提取记录时)。肯定可以将Y拉到X之前。
分片“流”功能在许多情况下很有用。
(例如,视频服务使用用户名和电影名称作为分区键将电影流式传输到用户)。
(例如,处理一系列常见事件并应用汇总)。
在不需要排序(流式传输)或分组(例如聚合)的情况下,生成随机分区密钥就足够了。
归档时间: |
|
查看次数: |
10511 次 |
最近记录: |