gpt4 book ai didi

node.js - AWS Kinesis 中的分区键是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:04:24 25 4
gpt4 key购买 nike

我正在阅读有关 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 哈希来决定在哪个分片上存储记录(如果您描述了流,您会看到哈希范围作为分片描述的一部分)。

那么为什么这很重要?

每个分片每秒只能接受 1,000 条记录和/或 1 MB(请参阅 PutRecord 文档)。如果您写入单个分片的速度超过此速率,您将获得 ProvisionedThroughputExceededException

使用多个分片,您可以扩展此限制:4 个分片可以为您提供 4,000 条记录和/或每秒 4 MB。当然,也有一些注意事项。

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

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

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


另一个答案指出记录在分区内排序,并声称这是分区键的真正原因。但是,此顺序反射(reflect)了 Kinesis 接受记录的顺序,这不一定是客户想要的顺序。

  • 如果客户端是单线程的并且使用 PutRecord API,那么是的,客户端和分区之间的顺序应该是一致的。
  • 如果客户端是多线程的,那么所有标准分布式系统的无序原因(内部线程调度、网络路由、服务调度)都可能导致顺序不一致。
  • 如果客户使用 PutRecords API,批处理中的单个记录可以被拒绝并且必须重新发送。该文档非常清楚此 API 调用不保留排序。在大容量环境中,这是您将使用的 API。

除了写入时的顺序不一致之外,重新分片操作还会在读取时引入不一致的可能性。您必须遵循从 parent 到 child 的链条,认识到可能有更多或更少的 child ,并且 split 可能不均匀。一种天真的“每个分片一个线程”的方法(例如 Lambda 使用的)是行不通的。

所以,底线:是的,分片提供排序。但是,依赖该顺序可能会在您的应用程序中引入难以诊断的错误。

在大多数情况下,这无关紧要。但是如果您需要保证顺序(例如在处理事务日志时),那么您必须在记录写入时将自己的排序信息添加到记录中,并确保在读取时记录正确排序。 p>

关于node.js - AWS Kinesis 中的分区键是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48399903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com