我读了大约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页,但不明白它的意思.

推荐答案

分区键只在流中有多个碎片时才起作用(但它们总是必需的).Kinesis计算分区键的MD5散列,以决定将记录存储在哪个碎片上(如果您描述流,您将看到散列范围作为碎片描述的一部分).

那么为什么这很重要呢?

每个碎片每秒只能接受PutRecord0条记录和/或1MB(参见PutRecord文档).如果你写一个碎片的速度超过这个速度,你会得到ProvisionedThroughputExceededException分.

对于多个碎片,您可以扩展这个限制:4个碎片每秒提供4000条记录和/或4MB.当然,也有一些警告.

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

第二个警告是,分区密钥根据总写入大小计数,并存储在流中.因此,虽然通过在记录中使用一些文本成分可能会获得很好的随机性,但这是在浪费空间.另一方面,如果您有一些随机的文本组件,您可以从中计算您自己的哈希,然后为分区键将其字符串化.

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

Node.js相关问答推荐

如何使用MongoDB在Node.js 中向数组中添加项?

Node.js分页返回空数组

未显示NPM版本

使用NodeJS通过服务账号列出Google Workspace用户

eSignature API 的 NodeJS SDK 是否支持数据流?

未捕获的错误: 只能用作 元素的子元素,永远不会直接呈现.请将您的 包裹在

找不到react 模块:错误:默认条件应该是最后一个

如何在没有 Typescript 的情况下以交互方式使用 Create-React-App?

如何解决这个关于 TaskRunner 的 Node/Express 代码问题?

错误:找不到模块'C:\Users\nguye\AppData\Local\nodejs\node_modules\npm\bin\npm-cli.js'

Cypress net::ERR_EMPTY_RESPONSE 在真实服务器调用上

解决并行保存到 mongodb

如何使用 UglifyJS 缩小文件夹中的多个 Javascript 文件?

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

如何在 node 中转义 shell 命令的字符串?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?

如何从命令行在 Node.js 上运行 Jasmine 测试

什么是 JavaScript 中的REPL?

从 node.js 连接到 mongodb 时出现 ECONNREFUSED 错误

如何调试 Gulp 任务?