一般性问题

问:什么是 Amazon Kinesis Data Streams?

借助 Amazon Kinesis Data Streams,您可以构建用于处理或分析流数据的自定义应用程序,以满足特定需求。您可将来自成千上万个来源的点击流、应用程序日志和社交媒体等数据持续添加到 Amazon Kinesis 数据流。在数秒内,您的 Amazon Kinesis 应用程序便可以从数据流读取和处理数据。

问:Amazon Kinesis Data Streams 可代我管理哪些内容?

Amazon Kinesis Data Streams 管理在数据吞吐量层面流处理您的数据所需的基础设施、存储、网络和配置。您无需为数据流担心硬件、软件或其他服务的配置、部署和持续维护。此外,Amazon Kinesis Data Streams 还可以跨三个可用区同步复制数据,实现高可用性和数据持久性。

问:Amazon Kinesis Data Streams 有什么作用?

Amazon Kinesis Data Streams 对于从数据创建器快速移出数据,然后进行持续处理非常有用。原因在于,在传输数据到数据存储、运行实时指标和分析或得出更复杂的数据流进行进一步处理之前,它会转换数据。以下是使用 Amazon Kinesis Data Streams 的典型情景:

  • 加速日志和数据传送获取:您无需等待批量处理数据,而是让数据生产者在生成数据后立即输入 Amazon Kinesis 数据流,防止因数据生产者出现故障导致的数据损失。例如,系统和应用程序日志可以持续添加到数据流并可在数秒内进行处理。
  • 实时指标和报告:您可以实时从 Amazon Kinesis 数据流数据提取指标并生成报告。例如,您的 Amazon Kinesis 应用程序可以在数据流入时直接处理系统和应用程序日志的指标和报告,而无需等待收到批量数据。
  • 实时数据分析:通过 Amazon Kinesis Data Streams,您可以运行实时流数据分析。例如,您可以将点击流添加到 Amazon Kinesis 数据流,并让您的 Amazon Kinesis 应用程序实时运行分析,从而在数分钟内从数据中获得重要见解,而无需数小时或数天时间。
  • 复杂的数据流处理:您可以创建 Amazon Kinesis 应用程序和数据流的 Directed Acyclic Graphs (DAG)。在这一情景中,一个或多个 Amazon Kinesis 应用程序可将数据添加到一个 Amazon Kinesis 数据流进行进一步处理,以便于进行流处理器的后续阶段。

问:如何使用 Amazon Kinesis Data Streams?

注册 Amazon Web Services 后,可按以下步骤使用 Amazon Kinesis Data Streams:

  • 通过 AWS 管理控制台CreateStream 操作创建 Amazon Kinesis 数据流。
  • 将数据生产者配置为持续向数据流添加数据。
  • 使用 Kinesis APIAmazon Kinesis Client Library (KCL) 构建您的 Amazon Kinesis 应用程序,以读取和处理来自数据流的数据。

问:Amazon Kinesis Data Streams 有哪些限制?

通过增加数据流内的分区数量,Amazon Kinesis 数据流的吞吐量能够无限扩展。然而,在使用 Amazon Kinesis Data Streams 时,您需要注意一些限制:

  • 默认情况下,流中的记录自添加之时起 24 小时内可用。您可以通过启用延长数据保留期限将该限值提升值最长 7 天。
  • 一个记录内的数据 Blob 的大小上限(Base64 编码前的数据负载)为 1MB。
  • 每个分区最高可支持每秒 1000 个 PUT 输入记录。

有关其他 API 等级限制的更多信息,请参阅 Amazon Kinesis Data Streams 限制

问:Amazon Kinesis Data Streams 与 Amazon SOS 有何区别?

Amazon Kinesis Data Streams 允许实时处理大数据流。它提供了记录排序,以及以使用与多个 Amazon Kinesis 应用程序相同的顺序读取和/或重播数据记录的能力。Amazon Kinesis Client Library (KCL) 能够将给定分区键的所有记录提供给同一记录处理器,从而能够更加轻松地构建从同一 Amazon Kinesis 数据流读取数据的多个应用程序(例如,执行计数、累积和筛选)。

Amazon Simple Queue Service (Amazon SQS) 提供了可靠且高度可扩展的托管队列,可用于当消息在计算机之间传输时存储消息。Amazon SQS 让您能够在分布式应用程序组件之间轻松移动数据,并帮助构建可独立处理消息的应用程序(带消息级确认/失败语义),例如自动工作流。

问:应该何时使用 Amazon Kinesis Data Streams,何时使用 Amazon SQS?

我们建议将 Amazon Kinesis Data Streams 用于具有类似以下要求的使用案例:

  • 将相关记录路由到同一记录处理器(如同在流处理 MapReduce 中一样)。例如,当给定键的所有记录被传输到同一记录处理器时,计数和聚合等操作更加简单。
  • 记录的排序。例如,您希望将日志数据从应用程序主机传输到处理/归档主机,同时保持日志报表的顺序。
  • 多个应用并发使用同一数据流的能力。有一个应用程序需要更新实时控制面板,另一个应用程序需要将数据归档至 Amazon Redshift。您希望这两个应用程序并行独立地使用同一数据流的数据。
  • 在数小时后以同一顺序使用记录的能力。例如,您有一个计费应用程序和一个审计应用程序,后者在前者几小时后运行。由于 Amazon Kinesis Data Streams 最多存储数据 7 天,因此您可在记账应用程序运行后的最长 7 天内运行审计应用程序。

我们建议将 Amazon SQS 用于具有类似以下要求的使用案例:

  • 消息收发语义(如消息级别确认/失败)和可见性超时。例如,您拥有一个工作项目队列,同时希望单独跟踪每个项目的成功完成情况。Amazon SQS 跟踪确认/失败,因此应用程序无需保留持续的检查点/光标。在配置的可见性超时后,Amazon SQS 将删除已确认消息并重新提交失败的消息。
  • 单个消息延迟。例如,您拥有一个作业队列,同时需要计划带延迟的单个作业。通过 Amazon SQS,您可为单个消息配置为具有最多 15 分钟的延迟。
  • 动态增加读取时间的并发性/吞吐量。例如,您拥有一个工作队列,同时希望添加更多读者,直到储备清除。通过 Amazon Kinesis Data Streams,您可以扩展到足够数量的分区 (但请注意,您需要提前配置足够的分区)。
  • 充分利用 Amazon SQS 的透明扩展功能。例如,由于业务的偶尔负载尖峰或自然增长,您将缓存请求和负载变化。由于每个缓存的请求可以单独处理,因此 Amazon SQS 可以透明扩展以处理负载,无需提供任何配置说明。

重要概念

问:什么是分区?

分区是 Amazon Kinesis 数据流的基本吞吐量单位。一个分片提供 1MB/秒数据输入和 2MB/秒输入输出容量。一个分片最高可支持每秒 1 000 个 PUT 记录。创建数据流时,您将指定所需的分区数量。例如,您可以创建具有两个分区的数据流。这一数据流具有 2MB/秒数据输入和 4MB/秒数据输出的吞吐量,并每秒允许最多 2000 个 PUT 记录。您可以监控 Amazon Kinesis Data Streams 中的分区级别指标,并随着数据吞吐量的变化,通过对流重新分区,从您的数据流中动态添加或删除分区。

问:什么是记录?

记录是存储在 Amazon Kinesis 数据流中的数据单元。记录由序列号、分区键和数据 Blob 组成。数据 Blob 是您的数据创建器添加到数据流的重要数据。数据 Blob (Base64 编码前的数据有效载荷) 的大小上限为 1MB。

问:什么是分区键?

分区键用于隔离记录并将其路由到不同的数据流分区。分区键由您的数据生产者在添加数据到 Amazon Kinesis 数据流时指定。例如,假定您的数据流具有两个分区(分区 1 和分区 2)。您可以将数据生产者配置为使用两个分区键(键 A 和键 B),将所有带键 A 的记录添加到分区 1 中,并将所有带键 B 的记录添加到分区 2 中。

问:什么是序列号?

序列号是每个记录的唯一标识符。序列号由 Amazon Kinesis 在数据生产者调用 PutRecord 或 PutRecords 操作以添加数据到 Amazon Kinesis 数据流时分配。同一分区键的序列号通常会随时间变化而变大;PutRecordPutRecords 请求之间的时间段越长,序列号变得越大。

创建 Data Streams

问:如何创建 Amazon Kinesis 数据流?

注册 Amazon Web Services 后,您可以通过 Amazon Kinesis 管理控制台CreateStream 操作创建 Amazon Kinesis 数据流。

问:如何决定 Amazon Kinesis 数据流的吞吐量?

Amazon Kinesis 数据流的吞吐量由数据流内的分区数量决定。请遵照以下步骤估算您的数据流需要的初始分区数量。注意:通过重新分区功能,您可以动态调整数据流内的分区数量。

  1. 预计写入数据流的记录的平均大小为千字节 (KB),四舍五入为 1KB。(average_data_size_in_KB)
  2. 预计每秒写入数据流的记录数量。(number_of_records_per_second)
  3. 决定并行和独立于数据流使用数据的 Amazon Kinesis 应用程序的数量。(number_of_consumers)
  4. 计算传入写入带宽 (KB) (incoming_write_bandwidth_in_KB),这相当于 average_data_size_in_KB 乘以 number_of_records_per_seconds。
  5. 计算传出读取带宽 (KB) (outgoing_read_bandwidth_in_KB),这相当于 incoming_write_bandwidth_in_KB 乘以 number_of_consumers。

然后,您可以使用以下公式计算数据流需要的初始分区数量 (number_of_shards):

number_of_shards = max (incoming_write_bandwidth_in_KB/1000, outgoing_read_bandwidth_in_KB/2000)

问:可为 Amazon Kinesis 数据流请求的最小吞吐量是多少?

Amazon Kinesis 数据流的吞吐量按分区单位扩展。单个分区是数据流的最小吞吐量,提供 1MB/秒数据输入和 2MB/秒数据输出。

问:可为 Amazon Kinesis 数据流请求的最大吞吐量是多少?

Amazon Kinesis 数据流的吞吐量可无限扩展。默认情况下,每个账户可为每个区域配置 10 个分区。您可以使用 Amazon Kinesis Data Streams 限制表单为单个区域请求超过 10 个分区。

问:记录大小如何影响 Amazon Kinesis 数据流的吞吐量?

分区提供 1MB/秒的数据输入速率,同时支持每秒最多 1000 个 PUT 记录。因此,如果记录大小不到 1KB,则分区的实际输入速率将小于 1MB/秒,受每秒最大 PUT 记录数的限制。

向 Kinesis 数据流添加数据

问:如何向 Amazon Kinesis 数据流添加数据?

您可以通过 PutRecordPutRecords 操作、Amazon Kinesis Producer Library (KPL)Amazon Kinesis Agent 将数据添加到 Amazon Kinesis 数据流。

问:PutRecord 和 PutRecords 之间有何区别?

PutRecord 操作支持 API 调用内的单个数据记录,而 PutRecords 操作支持 API 调用内的多个数据记录。有关 PutRecord 和 PutRecords 操作的更多信息,请参阅 PutRecordPutRecords

问:什么是 Amazon Kinesis Producer Library (KPL)?

Amazon Kinesis Producer Library (KPL) 是易于使用且高度可配置的程序库,可以帮助您把数据放到 Amazon Kinesis 数据流中。KPL 呈现了简单的异步可靠界面,使您能够快速实现高创建器吞吐量而客户资源最少。

问:我可以使用什么编程语言或平台访问 Amazon Kinesis API?

Amazon Kinesis API 在 Amazon Web Services SDK 中可用。有关 Amazon Web Services SDK 的编程语言或平台的列表,请参阅用于 Amazon Web Services 的工具

问:Amazon Kinesis Producer Library (KPL) 采用什么编程语言?

Amazon Kinesis Producer Library (KPL) 的核心采用 C++ 模块构建,并且可以编译为使用最新 C++ 编译器在任何平台上工作。该库目前采用 Java 界面。我们期待添加对其他编程语言的支持。

问:什么是 Amazon Kinesis Agent?

Amazon Kinesis Agent 是一款预构建的 Java 应用程序,可提供简单的方法来收集数据并将其发送到 Amazon Kinesis 数据流。您可以在基于 Linux 的服务器环境 (如 Web 服务器、日志服务器和数据库服务器) 上安装此代理。代理监控特定文件并持续发送数据到数据流。有关更多信息,请参阅使用代理执行写入操作

问:Amazon Kinesis Agent 支持哪些平台?

目前,Amazon Kinesis Agent 支持 Amazon Linux 或 Red Hat Enterprise Linux。

问:在哪里能够获得 Amazon Kinesis Agent?

您可以使用下面的命令及链接下载和安装 Amazon Kinesis Agent:

在 Amazon Linux 上:sudo yum install –y aws-kinesis-agent

在 Red Hat Enterprise Linux 上:sudo yum install –y https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm

通过 GitHub:awlabs/amazon-kinesis-agent

问:如何使用 Amazon Kinesis Agent?

在服务器上安装 Amazon Kinesis Agent 后,您可以对其进行配置以监控磁盘上的特定文件,然后持续地将新数据发送到 Amazon Kinesis 数据流。有关更多信息,请参阅 Writing with Agents

问:如果数据生产者向数据流添加数据时超出 Amazon Kinesis 数据流的容量限制,该怎么办?

Amazon Kinesis 数据流的容量限制由流内的分区数量来定义。数据吞吐量或 PUT 记录的数量可能会超过限制。超过容量限制后,输入数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这由临时的数据流输入数据速率增加导致,则数据生产者将重试并最终完成请求。如果这由持续的数据流输入数据速率增加导致,则应增加数据流内的分区数量,从而为输入数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都能让您了解数据流输入数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。

问:在 PutRecord 或 PutRecords 调用期间,哪些数据计入 Amazon Kinesis 数据流的数据吞吐量?

您的数据 Blob、分区键和数据流名称是 PutRecordPutRecords 调用的必要参数。您的数据 Blob(Base64 编码之前)和分区键的大小将依照 Amazon Kinesis 数据流的数据吞吐量计数,这由数据流内的分区数量确定。

增强型扇出功能

问:什么是增强型扇出功能?

增强型扇出功能是面向 Kinesis Data Streams 使用者的一项可选功能,可在使用者和分区之间提供吞吐量高达 2MB/秒的逻辑管道,让客户能够在保持高性能的同时,扩展从数据流中读取的使用者数量。

问:使用者如何开始使用增强型扇出功能?

使用者首先必须注册 Kinesis Data Streams 服务。默认情况下,使用者注册即可激活增强型扇出功能。如果您使用的是 KCL,KCL 版本 2.x 会自动为您的使用者注册,并使用 KCL 应用程序的名称作为试用者名称。完成注册后,所有已注册的使用者都将拥有预置的增强型扇出吞吐量逻辑管道。然后,使用者可以使用 HTTP/2 SubscribeToShard API 来检索这些吞吐量管道中的数据。HTTP/1 GetRecords API 目前不支持增强型扇出,因此您需要升级到 KCL 2.x,或为您的使用者注册,让使用者来调用 SubscribeToShard API。

问:使用者通过什么方式来利用增强型扇出功能?

使用者可以通过使用 SubscribeToShard API 检索数据来利用增强型扇出功能。已注册的使用者名称同时也在 SubscribeToShard API 内使用,从而让已注册的使用者能够利用增强型扇出的优势。

问:何时应该使用增强型扇出功能?
如果您有或可能有多个使用者并行从流中检索数据,或者如果您有至少一个使用者需要使用 SubscribeToShard API 在生产者和使用者之间提供低于 200 毫秒的数据传输速度,那么您应该使用增强型扇出功能。

问:我是否可以只让某些使用者使用增强型扇出功能,不让其他人使用?

可以。您可以让多个使用者使用增强型扇出功能,而不让其他人同时使用。使用增强型扇出功能不影响供传统 GetRecords 使用的分区限制。

问:在给定流中使用增强型扇出功能是否有使用者数量限制?

默认情况下,每个数据流中使用增强型扇出功能的使用者数量限制为 5 个。如果您需要的使用者超过 5 个,请通过 AWS Support 提交限额增加请求。请注意,您可以让 5 个使用者使用增强型扇出功能,同时不让其他使用者使用,从而让 5 个以上使用者从数据流中读取。

问:使用者如何注册使用增强型扇出功能和 HTTP/2 SubscribeToShard API?

我们建议使用 KCL 2.x,该版本会自动为您的使用者注册,让其使用增强型扇出功能和 HTTP/2 SubscribeToShard API。或者,您也可以使用 RegisterStreamConsumer API 手动注册使用者,然后使用已注册的使用者名称来使用 SubscribeToShard API。

问:使用增强型扇出是否会产生相关成本?

会。除了被检索的每 GB 数据的检索成本外,流中的分区和注册使用增强型扇出的使用者的每个组合还会产生按需小时费用。有关更多信息,请参阅 Kinesis Data Streams 定价页面

问:如何计算使用者分区小时?

使用者分区小时数可以由已注册的流使用者数量乘以流中的分区数量计算得出。例如,如果使用者分区的小时成本为 0.015 USD,那么对于有 10 个分区的数据流来说,使用增强型扇出的使用者将能够从 10 个分区读取,从而产生每小时 0.15 USD(1 个使用者 x 10 个分区 x 0.015 USD/使用者分区小时)的使用者分区小时费用。如果有两名使用者同时注册使用增强型扇出,则每个使用者分区小时的总费用为 0.30 USD(2 个使用者 x 10 个分区 x 0.015 USD)。

问:如果我在一小时内终止或启动了使用者,那么增强型扇出的使用者分区小时费用会自动按比例分摊吗?

会。您只需支付使用者注册使用增强型扇出的小时费用按比例分摊后的费用即可。

问:增强型扇出功能数据检索如何计费?

您支付较低的每 GB 费用,此费用根据使用者使用增强型扇出检索的每字节数据计算,没有最低费用,负载也不会向上取整。

问:是否需要更改生产者或数据流才能使用增强型扇出?

不需要。您可以在不影响数据生产者或数据流的情况下激活增强型扇出。

读取和处理来自 Kinesis 数据流的数据

问:什么是 Amazon Kinesis 应用程序?

Amazon Kinesis 应用程序是读取和处理来自 Amazon Kinesis 数据流的数据使用者。您可以使用 Amazon Kinesis Data AnalyticsAmazon Kinesis API Amazon Kinesis Client Library (KCL) 构建您的应用程序。

问:什么是 Amazon Kinesis Client Library (KCL)?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL) 是一个预构建库,可帮助您轻松构建 Amazon Kinesis 应用程序,用以读取和处理来自 Amazon Kinesis 数据流的数据。

KCL 可以处理各种复杂的问题,如适应数据流的数量变化、均衡流数据负载、协调分布式服务以及通过容错方式处理数据。KCL 支持您在构建应用程序时专注于业务逻辑。KCL 2.x 支持带有增强型扇出功能的 HTTP/1 GetRecords 和 HTTP/2 SubscribeToShard API,用于从流中检索数据。KCL 1.x 不支持 SubscribeToShard API 或增强型扇出功能。

问:如何从 KCL 1.x 升级到 2.x 以使用 SubscribeToShard 和增强型扇出功能?

请访问 Kinesis Data Streams 用户文档,了解如何从 KCL 1.x 升级到 KCL 2.x。

问:什么是 SubscribeToShard API?

SubscribeToShard API 是一种高性能的流 API,通过持久连接将数据从分区推送到使用者,无需客户端的请求周期。当新数据到达分区时,SubscribeToShard API 会使用 HTTP/2 协议将数据传输给已注册的使用者,时间通常不超过 70 毫秒内,与 GetRecords API 相比传输速度提高近 65%。即便有多个已注册使用者从统一分区同一中读取,其传输速度依然很快。

问:能否在不使用增强型扇出的情况下使用 SubscribeToShard?

不能。SubscribeToShard 离不开增强型扇出的使用,这意味着您需要先为使用者注册 Kinesis Data Streams 服务,然后才能使用 SubscribeToShard。

问:SubscribeToShard 持久连接可以持续多久?

持久连接最长可持续 5 分钟。

问:Kinesis Client Library (KCL) 是否支持 SubscribeToShard?

支持。KCL 版本 2.x 使用 SubscribeToShard 和增强型扇出从 Kinesis 数据流中检索具有高性能的数据。

问:使用 SubscribeToShard 是否会产生相关费用?

不会。使用 SubscribeToShard 不会产生相关费用。但是 SubscribeToShard 必须与增强型扇出功能搭配使用,这样一来,每个使用者分区小时组合和通过增强型扇出功能传输的每 GB 数据将会产生额外的小时费用。

问:如果我想使用 SubscribeToShard,是否需要使用增强型扇出?

需要。要使用 SubscribeToShard,您需要为使用者注册,注册会激活增强型扇出功能。默认情况下,您的使用者会在通过 SubscribeToShard 检索数据时自动使用增强型扇出功能。

问:什么是 Amazon Kinesis Connector Library?

Amazon Kinesis Connector Library 是一个预构建库,可帮助您轻松完成 Amazon Kinesis Data Streams 与其他 AWS 产品和第三方工具的集成。使用 Amazon Kinesis Connector Library 需要适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL)。该库的最新版本为 Amazon DynamoDB、Amazon Redshift 和 Amazon S3 和 Elasticsearch 提供了连接件。该库还包括各种类型的示例连接件,并有 Apache Ant 来构建运行示例的文件。

问:什么是 Amazon Kinesis Storm Spout?

Amazon Kinesis Storm Spout 是一个预建库,可帮助您轻松将 Amazon Kinesis Data Streams 与 Apache Storm 集成。最新版本的 Amazon Kinesis Storm Spout 从 Amazon Kinesis 数据流获取数据,再作为元组发出。您将此 spout 添加到 Storm 拓扑中,以将 Amazon Kinesis Data Streams 作为一种可靠、可扩展、流捕获、存储以及重播服务来使用。

问:Amazon Kinesis Client Library (KCL)、Amazon Kinesis Connector Library 和 Amazon Kinesis Storm Spout 提供哪几种编程语言版本?

Amazon Kinesis Client Library (KCL) 当前提供 Java、Python、Ruby、Node.js 和 .NET 版本。Amazon Kinesis Connector Library 和 Amazon Kinesis Storm Spout 当前提供 Java 版本。我们期待添加对其他编程语言的支持。

问:我是否必须为我的 Amazon Kinesis 应用程序使用 Amazon Kinesis 客户端库 (KCL)?

不是。您还可以使用 Amazon Kinesis API 构建 Amazon Kinesis 应用程序。但是,我们建议使用适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL)(如适用),因为它会执行与分布式流处理关联的繁重任务,可帮助您更高效地开发 Amazon Kinesis 应用程序。

问:Amazon Kinesis Client Library (KCL) 如何与 Amazon Kinesis 应用程序交互?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL) 是 Amazon Kinesis Data Streams 和 Amazon Kinesis 应用程序之间的中间程序。KCL 使用 IRecordProcessor 接口来与应用程序通信。您的应用程序实施此接口,同时 KCL 使用此接口中的方法调用您的应用程序代码。

有关使用 KCL 构建 Amazon Kinesis 应用程序的更多信息,请参阅使用 Amazon Kinesis 客户端库为 Amazon Kinesis 开发消费者应用程序

问:什么是 Amazon Kinesis Client Library (KCL) 生成的工作程序和记录处理器?

Amazon Kinesis 应用程序可以有多个应用程序实例,而工作程序则是映射到各个应用程序实例的处理单元。记录处理器是处理来自 Amazon Kinesis 数据流分区数据的处理单元。一个进程映射到一个或多个记录处理器。一个记录处理器映射到一个分区,并从该分区处理记录。

启动时,应用程序会调用适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL),以实例化工作程序。这一调用将为应用程序提供带配置信息的 KCL,如数据流名称和 AWS 凭证。这一调用还会传输对 IRecordProcessorFactory 实施的引用。KCL 使用此工厂来按需创建新的记录处理器,以处理来自数据流的数据。KCL 使用 IRecordProcessor 接口与这些记录处理器通信。

问:Amazon Kinesis Client Library (KCL) 如何持续跟踪 Amazon Kinesis 应用程序正在处理的数据记录?

适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL) 会自动为每个 Amazon Kinesis 应用程序创建一个 Amazon DynamoDB 表,以跟踪和维护状态信息,如重新分区事件和序列号检查点。DynamoDB 表与应用程序共享同一名称,因此您需要确保应用程序名称不与同一区域的任何现有 DynamoDB 表冲突。

假定所有与同一应用程序名称关联的工作线程在同一 Amazon Kinesis 数据流上配合工作。如果您运行同一应用程序代码的其他实例,但使用不同的应用程序名称,则 KCL 会将第二个实例视为在同一数据流运行的完全独立的应用程序。

请注意,除了与 Amazon Kinesis Data Streams 关联的成本之外,还将对账户收取与 Amazon DynamoDB 表关联的费用。

有关 KCL 如何跟踪 Amazon Kinesis 应用程序状态的更多信息,请参阅跟踪 Amazon Kinesis 应用程序状态

问:我如何使用 Amazon Kinesis Client Library (KCL) 自动扩展 Amazon Kinesis 应用程序的处理容量?

您可为您的 Amazon Kinesis 应用程序创建多个实例,并让这些应用程序实例与属于 Auto Scaling 组的一组 Amazon EC2 实例交叉运行。尽管处理需求增长,但是运行您应用程序实例的 Amazon EC2 实例将自动实例化。适用于 Java | Python | Ruby | Node.js | .NET 的 Amazon Kinesis Client Library (KCL) 将为此新实例生成工作程序,并将记录处理器从超载的现有实例自动移动到此新实例。

问:当 Amazon Kinesis 数据流中存在数据时,GetRecords 调用为何返回空结果?

一个可能的原因是,当前分区迭代器指定的位置没有任何记录。即使您使用 TRIM_HORIZON 作为分区迭代器类型,也仍可能出现这种情况。Amazon Kinesis 数据流代表着持续的数据流。您应在一个循环中调用 GetRecords 操作,相关记录将在分区迭代器数据记录存储到位时返回。

问:GetRecords 操作中返回的 ApproximateArrivalTimestamp 是什么?

每条记录都包含一个名为 ApproximateArrivalTimestamp 的值。Amazon Kinesis 会在成功收到并存储记录后设置该值。该时间戳精确到毫秒,但时间戳的准确性并不能保证。例如,分区中或跨数据流的记录的时间戳可能是乱序的。

问:如果 Amazon Kinesis 应用程序从数据流读取数据时超出 Amazon Kinesis 数据流的容量限制该怎么办?

Amazon Kinesis 数据流的容量限制由流内的分区数量来定义。数据吞吐量或读取数据调用的数量可能会导致超出容量限制。超过容量限制时,读取数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这由临时的数据流输出数据速率增加导致,则 Amazon Kinesis 应用程序将重试并最终完成请求。如果这由持续的数据流输出数据速率增加导致,则应增加数据流内的分区数量,从而为读取数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都能让您了解数据流输出数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。

管理 Kinesis 数据流

问:如何更改 Amazon Kinesis 数据流的吞吐量?

有两种方法可以更改数据流的吞吐量。您可以使用 UpdateShardCount API 或 AWS 管理控制台来扩展数据流中的分区数量,也可以通过调整数据流中的分区数量(重新分区)来更改 Amazon Kinesis 数据流的吞吐量。

问:使用 UpdateShardCount 或 AWS 管理控制台更改 Amazon Kinesis 数据流的吞吐量需要多长时间?

一般的扩展请求只需几分钟时间即可完成,较大的扩展请求需要的时间要长于较小的请求。

问:UpdateShardCount 上限是多少?

有关 UpdateShardCount 上限的信息,请参阅 Amazon Kinesis Data Streams Service API Reference

问:使用 UpdateShardCount 或通过重新分区更改 Amazon Kinesis 数据流的吞吐量后,Amazon Kinesis Data Streams 是否仍然可用?

可以。在使用 UpdateShardCount 或通过重新分区更改数据流吞吐量期间,您可以继续向 Amazon Kinesis 数据流添加数据和从中读取数据。

问:什么是重新分区?

重新分区是通过对一系列分区进行拆分或合并来扩展数据流的过程。在分区拆分中,单个分区被分为两个分区,这将增加数据流的吞吐量。在分区合并中,两个分区被合并到单个分区,这将减少数据流的吞吐量。有关更多信息,请参阅 Amazon Kinesis Data Streams 开发人员指南中的对数据流进行重新分区

问:使用重新分区更改 Amazon Kinesis 数据流的吞吐量需要间隔多久,每次需要多长时间?

分片拆分或分片合并等重新分片操作需要几秒钟。您一次仅能执行一个重新分片操作。因此,对于仅有一个分区的 Amazon Kinesis 数据流,拆分分区可在数秒内使吞吐量翻番。对于具有 1000 个分区的数据流,拆分 1000 个分区以便吞吐量翻番需要 30000 秒(8.3 小时)。当需要额外吞吐量时,我们建议您提前增加数据流的吞吐量。

问:如何更改 Amazon Kinesis 数据流的数据保留期限?

默认情况下,Amazon Kinesis 会将您的数据存储长达 24 小时。您可以通过启用延长数据保留期限来将数据保留期限值提升到长达 7 天。

有关更改数据保留期限的更多信息,请参阅更改数据保留期限

问:如何监控 Amazon Kinesis 数据流的运行和性能?

Amazon Kinesis Data Streams 管理控制台会显示关键运营和性能指标,如 Amazon Kinesis 数据流的数据输入和输出的吞吐量。Amazon Kinesis Data Streams 还与 Amazon CloudWatch 集成,以便您可以为数据流及其中的分区收集、查看和分析 CloudWatch 指标。有关 Amazon Kinesis Data Streams 指标的更多信息,请参阅利用 Amazon CloudWatch 监控 Amazon Kinesis Data Streams 服务

请注意,所有流级别的指标都是免费的。所有已启用的分区级别的指标均根据 Amazon CloudWatch 定价进行收费。

问:如何管理和控制对 Amazon Kinesis 数据流的访问权限?

Amazon Kinesis Data Streams 与 AWS Identity and Access Management (IAM) 服务集成,后者让您能够安全控制对 AWS 产品和用户资源的访问权限。例如,您可以创建仅允许特定用户或组向 Amazon Kinesis 数据流添加数据的策略。有关数据流访问管理和控制的更多信息,请参阅使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问

问:如何记录针对 Amazon Kinesis 数据流的 API 调用,以便用于安全分析和运行故障排除?

Amazon Kinesis 可与 Amazon CloudTrail 服务集成,后者可为您的账户记录 AWS API 调用并给您提供日志文件。有关 API 调用日志的更多信息和支持的 Amazon Kinesis API 操作的列表,请参阅使用 Amazon CloudTrail 记录 Amazon Kinesis API 调用

问:如何高效管理 Amazon Kinesis 数据流以及这些数据流的相关成本?

使用 Amazon Kinesis Data Streams,您能够标记 Amazon Kinesis 数据流,从而更加轻松地管理资源和成本。标签是以键-值对表示的用户定义的标记,帮助组织 AWS 资源。例如,您可以使用成本中心标记流,从而基于成本中心分类和跟踪 Amazon Kinesis Data Streams。有关 Amazon Kinesis Data Streams 标签的更多信息,请参阅标记您的 Amazon Kinesis Data Streams

问:如何描述使用分区上限的方式?

您可以使用 DescribeLimits API 来了解如何对账户使用分区上限。DescribeLimits API 将返回分区上限以及您的账户中开启的分区数。如果您需要提高分区上限,请申请提升上限

安全性

问:使用 Kinesis Data Streams 时,数据的安全性如何?

Kinesis 在默认情况下是安全的。仅账户和数据流所有者才有权访问自己创建的 Kinesis 资源。Kinesis 支持用户身份验证,以控制对数据的访问。您可以使用 AWS IAM 策略选择性地向用户和用户组授予权限。您可以使用 HTTPS 协议通过 SSL 终端节点安全地向 Kinesis 放入数据和从中获取数据。如果您需要额外的安全性,可使用服务器端加密和 AWS KMS 主密钥对存储在数据流中的数据进行加密。AWS KMS 允许您使用 AWS 生成的 KMS 主密钥进行加密,或者您也可以选择将自己的主密钥添加到 AWS KMS。最后,您还可以使用自己的加密库在客户端上加密要放入 Kinesis 的数据。

问:我可以在不使用公用 IP 的情况下,从 Amazon Virtual Private Cloud (VPC) 对 Kinesis Data Streams API 进行私有访问吗?

可以,您可以通过创建 VPC 终端节点来实现从 Amazon Virtual Private Cloud (VPC) 对 Kinesis Data Streams API 进行私有访问。借助 VPC 终端节点,VPC 和 Kinesis Data Streams 之间的路由可由 AWS 网络处理,而无需使用 Internet 网关、NAT 网关或 VPN 连接。Kinesis Data Streams 所使用的最新一代 VPC 终端节点由 AWS PrivateLink 提供支持。AWS PrivateLink 是一种通过使用 VPC 中带有私有 IP 的弹性网络接口 (ENI) 来支持各 AWS 产品之间的私有连接的技术。要了解有关 PrivateLink 的更多信息,请参阅 PrivateLink 文档

加密

问:能否加密输入 Kinesis 数据流的数据?

能。您可以通过两种方式加密输入 Kinesis 数据流的数据。您可以使用服务器端加密 (一项完全托管的功能),该功能会在您向数据流输入数据和从中提取数据时自动对数据进行加密和解密。或者,您也可以通过在客户端上进行加密和解密,向数据流写入加密数据。

问:为何应使用服务器端加密而非客户端加密?

出于以下任一原因,客户通常会选择服务器端加密而非客户端加密:

  • 很难执行客户端加密
  • 他们希望在客户端加密之上再增加一层安全保障
  • 很难实施客户端密钥管理方案

问:什么是服务器端加密?

适用于 Kinesis Data Streams 的服务器端加密会使用用户指定的 AWS KMS 主密钥 (CMK) 在数据写入数据流存储层之前自动加密,并在数据从存储中检索后进行解密。加密使得写入操作无法执行且无法读取负载和分区键,除非向数据流写入或从中读取数据的用户有权使用所选密钥在数据流上进行加密。因此,使用服务器端加密更易达到内部针对监管数据的安全性和合规性要求。

借助服务器端加密,客户端应用程序 (创建器和使用器) 无需获知加密,也无需管理 CMK 或加密操作,并且 Kinesis Data Streams 服务内的静态和动态数据都会得到加密。服务器端加密功能使用的所有 CMK 均由 AWS KMS 提供。AWS KMS 让您可以轻松使用适用于 Kinesis 的 AWS 托管型 CMK (一种“一键式”加密方法)、AWS KMS 为您生成的 CMK 或您为进行加密而导入的 CMK。

问:是否有服务器端加密入门指南?

有。用户文档中提供了入门指南。

问:服务器端加密是否会干扰应用程序与 Kinesis Data Streams 的交互方式?

可能会。这取决于您用于加密的密钥和监管密钥访问的权限。

  • 如果您使用适用于 Kinesis 的 AWS 托管型 CMK (密钥别名 = aws/kinesis),则借助此密钥启用或禁用加密不会影响您的应用程序。
  • 如果您使用其他主密钥(如自定义的 AWS KMS 主密钥或您导入 AWS KMS 服务的主密钥),且数据流的生产者和使用器无权使用加密所用的 AWS KMS CMK,那么 PUT 和 GET 请求将会失败。要使用服务器端加密,您必须先配置 AWS KMS 密钥策略以允许加密和解密消息。要了解相关示例和有关 AWS KMS 权限的更多信息,请参阅 AWS 密钥管理服务开发人员指南中的“AWS KMS API 权限:操作和资源参考”或 Kinesis Data Streams 服务器端加密用户文档中的权限指南。

问:使用服务器端加密是否会额外产生相关费用?

会。但如果您使用的是适用于 Kinesis 的 AWS 托管型 CMK,并且 KMS API 使用费没有超出免费套餐,则使用服务器端加密免费。下面按资源介绍了费用:

密钥:

  • 适用于 Kinesis 的 AWS 托管型 CMK (别名 = “aws/kinesis”) 是免费的。
  • 用户生成的 KMS 密钥会产生 KMS 密钥费。了解更多

KMS API 使用情况:

  • AWS 会对每个 CMK (包括定制 CMK) 收取 API 使用费用。轮换数据键时,Kinesis Data Streams 大约每 5 分钟调用一次 KMS。在 30 天的月份中,由 Kinesis 数据流发起的 KMS API 调用的总成本应该不会超过几美元。请注意,此费用将因您在数据创建器和使用器上使用的用户证书数量而异,因为每个用户证书需要对 AWS KMS 进行唯一的 API 调用。当您使用 IAM 角色进行身份验证时,每个 assume-role-call 都将生成唯一的用户证书,并且您可能希望缓存由 assume-role-call 返回的用户证书,从而节省 KMS 成本。

问:哪些 AWS 地区提供适用于 Kinesis Data Streams 的服务器端加密?

Kinesis Data Streams 服务器端加密已在 AWS GovCloud 地区和中国 (北京) 地区外的所有公共地区推出。

问:如何从数据流中启动、更新或移除服务器端加密?

所有这些操作均可通过 AWS 管理控制台或使用 AWS 开发工具包完成。要了解更多信息,请参阅 Kinesis Data Streams 服务器端加密入门指南

问:服务器端加密使用何种加密算法?

Kinesis Data Streams 使用 AES-GCM 256 算法进行加密。

问:如果加密了已写入数据(纯文本或密文格式)的数据流,那么在更新加密时,是否会加密或解密该数据流中的所有数据?

不会。应用新加密只会加密(或解密)写入该数据流的新数据。

问:适用于 Kinesis Data Streams 的服务器端加密会加密哪些内容?

服务器端加密会加密消息的负载以及数据流生产者应用程序指定的分区键。

问:服务器端加密是一项特定于分片的功能还是特定于数据流的功能?

服务器端加密是一项特定于数据流的功能。

问:能否更改用于加密特定数据流的 CMK?

能。使用 AWS 控制台或 AWS 开发工具包即可选择将新的主密钥应用到特定数据流。

问:能否向我演示数据的加密生命周期,从启用服务器端加密将其发送至 Kinesis 数据流到进行检索?

下面将向您演示 Kinesis Data Streams 如何使用 AWS KMS CMK 在消息存储到 PUT 路径之前进行加密以及在 GET 路径中检索后进行解密。如果启用了服务器端加密,那么当您在数据流上调用 putRecord(s) 或 getRecords 时,Kinesis 和 AWS KMS 会执行以下操作(包括解密)。

  1. 客户的 Kinesis 创建器应用程序 (客户端) 使用 SSL 通过 HTTPS 将数据发送至 Kinesis。
  2. Kinesis 接收数据并将其存储在 RAM 中,同时加密记录的负载和分区键。
  3. Kinesis 请求纯文本输入密钥材料 (IKM),并使用客户所选的 KMS 主密钥加密该 IKM 的副本。
  4. AWS KMS 创建 IKM,使用主密钥对其进行加密,然后将纯文本 IKM 和加密 IKM 一起发送至 Kinesis。
  5. Kinesis 使用纯文本 IKM 获取每个记录独有的数据密钥。
  6. Kinesis 使用这些数据密钥加密负载和分区键并从内存中移除纯文本密钥。
  7. Kinesis 将加密 IKM 附加到加密数据。
  8. 纯文本 IKM 缓存在内存中以供重复使用,直到 5 分钟之后过期。
  9. Kinesis 将加密消息传递至后端存储,以便静态存储并可通过调用 getRecords 进行提取。

在您调用 getRecords 时,Kinesis 和 AWS KMS 会执行以下操作 (包括解密)。

  1. 进行 getRecords 调用时,Kinesis 的前端会从后端服务中检索加密记录。
  2. Kinesis 使用客户的请求生成的令牌向 KMS 发出请求。AWS KMS 予以授权。
  3. Kinesis 解密随记录存储的加密 IKM。
  4. Kinesis 通过解密的 IKM 为每个记录重新创建数据密钥。
  5. 如果获得授权,Kinesis 会解密负载并从内存中移除纯文本数据密钥。
  6. Kinesis 通过 SSL 和 HTTPS 将负载传递至请求记录的 Kinesis 使用器 (客户端)。

定价与计费

问:AWS 免费套餐中是否提供 Amazon Kinesis Data Streams?

不,Amazon Kinesis Data Streams 当前不在 AWS 免费套餐中提供。AWS 免费套餐支持免费试用的一组 AWS 服务。有关 AWS 免费套餐的更多信息,请参阅 AWS 免费套餐

问:Amazon Kinesis Data Streams 如何收费?

Amazon Kinesis Data Streams 使用简单的按需付费定价结构。它没有预付费用或最低费用,您仅需为使用的资源付费。Amazon Kinesis Data Streams 的费用有两个核心维度和三个可选维度:

  • 每小时分区费用由您的 Amazon Kinesis 数据流内的分区数量决定。
  • PUT Payload Unit 收费根据数据创建器添加到您的数据流的 25KB 负载单元的数量决定。

可选:

  • 可选的延长数据保留期限的费用由您的数据流产生的分段时数决定。启用延长数据保留期限后,您需要为数据流中的每个分区支付延长保留期限费用
  • 增强型扇出成本是一项可选成本,具有两个成本维度:使用者分区小时和数据检索。使用者分区小时由流中的分区数量乘以使用增强型扇出的使用者数量计算得出。数据检索取决于提供给使用增强型扇出的使用者的 GB 数量。 

有关 Amazon Kinesis Data Streams 费用的更多信息,请参阅 Amazon Kinesis Data Streams 定价

问:用 PutRecords 操作取代 PutRecord 操作,PUT Payload Unit 费用是否会发生变化?

PUT Payload Unit 费用根据添加到您的 Amazon Kinesis 数据流的 25KB 负载单元的数量决定。无论使用 PutRecords 操作还是PutRecord 操作,PUT Payload Unit 费用都不变。

问:处于“CLOSED”状态的分区收费吗?

重新分区后,分区可能会处于“CLOSED”状态。处于“CLOSED”状态的分区不收费。

问:除了 Amazon Kinesis Data Streams 费用之外,使用 Amazon Kinesis Data Streams 是否还存在任何其他费用?

如果您使用 Amazon EC2 运行 Amazon Kinesis 应用程序,我们将对 Amazon EC2 资源收取费用,Amazon Kinesis Data Streams 费用除外。

Amazon Kinesis Client Library (KCL) 使用 Amazon DynamoDB 表跟踪记录处理的状态信息。如果您为自己的 Amazon Kinesis 应用程序使用 KCL,我们将对 Amazon DynamoDB 资源收取费用,Amazon Kinesis Data Streams 费用除外。

如果您启用增强的分区级别指标,则除了 Amazon Kinesis Data Streams 费用以外,还需要支付与已启用的分区级别指标相关的 Amazon CloudWatch 费用。

请注意,以上三个示例常见但并不详尽。

详细了解 Amazon Kinesis Data Streams 定价

访问定价页面
准备好开始使用了吗?
注册
还有更多问题?
联系我们