AWS Kinesis 中的分区键是什么?

2024-01-06

我正在读关于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真的是指这里吗?它在后台做什么?我读了它的文档 https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Kinesis.html#putRecord-property但不明白是什么意思。


仅当流中有多个分片时分区键才重要(但始终需要它们)。 Kinesis 计算分区键的 MD5 哈希来决定在哪个分片上存储记录(如果您描述流,您将看到哈希范围作为分片描述的一部分)。

那么为什么这很重要呢?

每个分片每秒只能接受 1,000 条记录和/或 1 MB(请参阅放置记录 https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html文档)。如果您写入单个分片的速度快于此速率,您将得到ProvisionedThroughputExceededException.

通过多个分片,您可以扩展此限制:4 个分片可为您提供 4,000 条记录和/或每秒 4 MB。当然,也有一些警告。

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

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

最后,如果您使用放置记录 https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html(如果您要写入大量数据,则应该这样做),请求中的个别记录可能会被拒绝,而其他记录可能会被接受。发生这种情况是因为这些记录发送到的分片已经达到其写入限制,并且您必须重新发送它们(在延迟后)。


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

  • 如果客户端是单线程并使用放置记录 https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.htmlAPI,那么是的,客户端和分区之间的排序应该一致。
  • 如果客户端是多线程的,那么所有标准分布式系统的无序原因(内部线程调度、网络路由、服务调度)都可能导致顺序不一致。
  • 如果客户端使用放置记录 https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.htmlAPI,批次中的单个记录可能会被拒绝,并且必须重新发送。该文档非常清楚地表明此 API 调用不保留顺序。在大容量环境中,这就是您将使用的 API。

除了写入时顺序不一致之外,重新分片操作还可能导致读取时出现不一致。您必须遵循从父母到孩子的链条,认识到可能有更多或更少的孩子,并且分割可能不均匀。简单的“每个分片一个线程”方法(例如 Lambda 使用的)是行不通的。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Kinesis 中的分区键是什么? 的相关文章

  • 有没有办法在 TypeScript 2+ 中全局添加类型定义?

    我有一堆简单的 ts files 不是项目 即独立的 ts 脚本 他们使用一些 Node js 功能 TypeScript 和节点类型定义通过安装 npm install g typescript npm install g types n
  • 使用 dnode 从服务器向客户端发送消息

    几个月前 我发现了 nowjs 和 dnode 并最终使用了 nowjs 并且https github com Flotype nowclient https github com Flotype nowclient 用于客户端 服务器双向
  • react-native-screens:compileDebugKotlin 错误

    失败 构建失败并出现异常 什么地方出了错 任务 react native screens compileDebugKotlin 执行失败 评估任务 react native screens compileDebugKotlin 的属性 fi
  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • NPM:切勿为 npm 包安装嵌套的可选依赖项

    我正在编写一个包 A 我想将其发布到 NPM A 依赖于包 B 而包 B 又依赖于包 C 然后 C 有两个可选的本机依赖项 D 和 E 我明确知道我没有使用可选依赖项 D 和 E 并且永远不想当有人安装我的软件包时尝试安装它们 我知道你可以
  • Node.js 进行 rsa 加密的正确方法?

    我正在尝试创建一个 WS 来发出肥皂请求 在消息正文中有一个包含加密文本的字段 我有公钥来加密文本 但我获得的唯一结果是文本无法识别 我使用节点的加密模块来发出请求 并且文本已加密 但我不知道为什么没有正确加密 PS我用 openssl p
  • Sequelize 4.3.2 n:m(多对多)关联:未处理的拒绝 SequelizeEagerLoadingError

    我有 3 个模型 用户 项目 UserProject module exports function sequelize DataTypes var User sequelize define User title DataTypes ST
  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • 需要运行需要超过 15 分钟才能完成的 aws lambda 函数?

    我的 Lambda 函数的时间限制为 15 分钟 早于 5 分钟 Lambda 进程在 15 分钟后自动终止 但我的进程需要超过 15 分钟 我该如何应对 这是没有办法解决的 如果您正在进行某种长时间运行的处理 那么您的另一个选择可能是在
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 尝试使用 AWS CLI 运行 ECS 任务时出现资源:内存错误

    我正在尝试使用 AWS ECS 和 docker 设置 CI 我使用 Codeship 作为 CI 工具 但这并不重要 我在 shell 脚本中执行以下步骤 使用我的 Dockerfile 构建镜像 将镜像推送到ECS存储库 将task d
  • 角度2多次错误TS2300:重复的标识符

    系统配置 ubuntu 14 04 节点 v gt v5 6 0 npm v gt 3 7 1 打字最新版本 不知道如何获取版本详细信息 第一次使用 angular2 时 我的文件夹样本 服务器结构如下 server js server t
  • 装饰器中间件模式的 Typescript 类型

    我正在考虑节点中间件 在各种框架中 通常 中间件会向请求或响应对象添加一个属性 然后该属性可供在其之后注册的任何中间件使用 此模型的一个问题是您无法进行有效的打字 为了进行演示 这里有一个此类框架的高度简化的模型 在这种情况下 一切都是同步
  • 如何在 DynamoDB 中有条件地执行 SET 操作

    我在 DynamoDb 中有一个包含以下列的聚合表 id sum count max min and hash 我会一直想更新sum and count但会想更新min and max仅当我的值大于 小于数据库中已有的值时 另外 我只希望此
  • 将实时流音频从 NodeJS 服务器获取到客户端

    我需要从 1 个客户端到服务器到多个侦听器客户端的实时实时音频流 目前 我正在从客户端进行录音 并通过 socket io 将音频流式传输到服务器 服务器接收此数据 并且必须将音频流式传输 也通过 socket io 到想要收听此流的客户端
  • 如何查看移动设备是否已注册

    我正在使用适用于 Amazon SNS 的 Amazon AWS Ruby SDK 但在已注册的设备方面遇到一些问题 有时 当设备再次注册时 我会收到类似错误AWS SNS Errors InvalidParameter Invalid p
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • Mongoose 总是返回空数组? [复制]

    这个问题在这里已经有答案了 我是nodejs i的新手 我已经有一个名为aqi的数据库 集合名称为pln 我试图在网页上显示集合中的所有记录 但猫鼬总是返回空数组 我已经用其他数据库测试了它 但我可以从它们获取数据 但对于 pln mong
  • AWS Amplify Appsync 解决创建具有关系的对象时出现的错误

    我正在尝试创建一个具有关系的对象 我正在使用自动生成的放大突变 当我创建一个没有关系的对象时 操作会成功 当我创建具有关系的对象时 操作失败 我收到的错误消息是 The variables input contains a field na
  • 节点未找到全局模块

    所以我意识到这是一个相当通用的标题和问题 但我已经搜索了很多答案 但遗憾的是它们似乎都不适合我 我希望通过我自己提供更多信息 也许有人有一个具体的答案 或者确切地知道将我重定向到哪个答案 我的问题 当我全局安装节点模块时 例如npm ins

随机推荐

  • 通过 .net 中的 web.config 利用浏览器缓存?

    有些站点位于共享主机 Windows 2003 Server 上 因此我无法访问服务器配置 我到处都读到了有关利用浏览器缓存的内容 特别是静态文件 jpg css js 等 但是 在我的情况下如何做到这一点 主机已安装 NET web co
  • Accepts_nested_attributes_for 和nested_form 插件

    我在 form html haml 部分中有以下代码 它用于新建和编辑操作 仅供参考 我使用 Ryan Bates 的插件嵌套形式 http github com ryanb nested form fields f fields for
  • 为什么“join”不是“Monad”类的一部分[重复]

    这个问题在这里已经有答案了 众所周知的事实是 gt gt 可以使用来实现fmap and join while join可以使用来实现 gt gt 我们有什么理由不定义Monad与 一起上课join包含并使用以下默认定义 join x x
  • 图表js可以处理多少数据

    对于我的应用程序 我正在发出数千个数据点的获取请求 当我使用图表js显示数据时 渲染时间很长 而且我遇到了滞后 我还注意到每个数据点的 x 轴标签没有正确显示 因此必须省略它们 我喜欢图表的时尚设计和用户界面 但无法让它很好地适合我的用例
  • 关闭谷歌地图 API v3 中所有打开的信息窗口

    正如标题所述 在给定的事件中 对我来说 这恰好是在打开一个新的事件时 google maps InfoWindow我希望能够关闭任何其他当前打开的信息窗口 现在 我可以一次打开很多个 但我只想一次只打开一个 我正在动态创建信息窗口 即我不提
  • 返回 f 字符串的 For 循环函数

    我是 python 新手 尝试编写一个函数 该函数接受字典列表并返回一个新的字符串列表 其中每个字典中的名字和姓氏键连接在一起 names first John last Smith first Jessie last Snow def n
  • 无法在react.js中使用本地图像

    基本上我无法使用本地图像 我真的不确定为什么 我已经安装了 url loader 和 file loader 并尝试请求该文件 HeaderNavigation js 我尝试使用的图像位于同一目录中 并被引用为品牌图像 Created by
  • 通过 Visual Studio 代码 launch.json 运行 foreman start

    目前 我正在通过输入运行我的解决方案foreman start进入命令行 工作正常 我正在尝试使用 Visual Studio 代码调试我的代码 为此 我创建了一个 launch json 文件 version 0 2 0 configur
  • 在Python中以特定模式打印字母

    我有以下字符串并将其拆分 gt gt gt st 2g k 3p gt gt gt l filter None st split gt gt gt print l 2g k 3p 现在我想打印 g 字母两次 k 字母一次 p 字母三次 gg
  • 双面文件问题

    我正在程序中读取 system32 文件夹中的一些文件 其中一个文件 C Windows System32 gdi32 dll 表现出一种非常奇怪的行为 当我从程序中读取它时 它显示大小为 310 784 字节 当我从资源管理器查看它的大小
  • 如何从控制器调用 EditorFor

    我有地点列表 public class Location public string LocationName get set public string Address get set 我为此类创建了编辑器模板 div span Html
  • 从视频文件创建缩略图返回空位图

    我发送启动摄像机的意图 PackageManager pm getPackageManager if pm hasSystemFeature PackageManager FEATURE CAMERA Intent video new In
  • 在三层控制台应用程序中使用常量或全局变量

    我有一个像这样的 3 层应用程序设置 带有控制台表示层 在我的业务逻辑中 我有一个类 我在其中声明了许多固定的不同变量 即值不会改变 这些变量的值取自应用程序设置 现在我发现的问题是我的类调用不同的方法 其中这些变量通过方法签名传递 这是好
  • 如何合并单个提交?

    有时我同时与多个分支机构合作 假设我有名为 master release 1 1 和 Experimental 的分支 我创建一个新文件或在实验中进行更改 并且我希望将一项更改应用于其他分支 我可以在 git 中执行此操作吗 如果我只是将提
  • “已连接”UDP 套接字收到 ICMP 端口不可达

    基于 UDP 是无连接协议的前提 我假设主机是否启动或关闭都无关紧要 然而 现在我正在进行测试 我发现当我 连接 我的 UDP 客户端套接字时 write到该套接字会返回错误 因为服务器已发回 ICMP 端口不可达错误 连接 UDP端口的目
  • 如何测量 Android 上的 VRAM 消耗?

    我想获取Android设备VRAM大小 有没有从程序中获取的方法 让我们使用 Nexus One 进行一些计算 屏幕分辨率为 480x800 因此所需的最小视频内存大小为 400 800 4 bytes 1536000 bytes 假设驱动
  • 用于获取 HDR(高动态范围)是否处于活动状态的 Windows API

    我的环境是Windows 10 20H2 64位 和Visual Studio 2019 我正在开发一个应用程序作为 C WPF NET 5 项目 我想编写一个代码 表明 HDR 高动态范围 当前在系统上处于活动状态 在本文档中 https
  • 如何在 Objective C 中将一个块作为参数传递给另一个块

    我正在尝试定义一个以块作为参数的块 下面这行代码有什么问题 id cacheResult NSString id void NSString name id void block NSObject item nil block return
  • nvm:无法卸载当前活动的节点版本

    我正在 OSX 上执行此操作 我需要删除节点 但是当我输入 cmd 后 nvm uninstall v4 4 7它提示我nvm 无法卸载当前活动的节点版本 v4 4 7如何彻底卸载node 只需输入以下命令 nvm deactivate 然
  • AWS Kinesis 中的分区键是什么?

    我正在读关于AWS Kinesis 在下面的程序中 我将数据写入名为的流中TestStream 我运行这段代码 10 次 将 10 条记录插入到流中 var params Data More Sample data into the tes