

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 选择正确的流式传入的模式
<a name="how-do-i-size-a-stream"></a>

以下主题说明了如何为应用程序选择最佳模式，以及如何根据需要切换模式。

**Topics**
+ [Kinesis Data Streams 中有哪些不同的模式？](#diff-modes-kds)
+ [按需标准模式的特征和用例](#ondemandmode)
+ [按需优势模式的特征和用例](#ondemand-advantage-mode)
+ [预置模式的特征和用例](#provisionedmode)
+ [切换模式](#switchingmodes)

## Kinesis Data Streams 中有哪些不同的模式？
<a name="diff-modes-kds"></a>

模式决定如何管理数据流的容量以及如何对数据流的使用收费。在 Amazon Kinesis Data Streams 中，您可以为数据流选择**按需标准**、**按需优势**和**预置**模式。
+ **按需标准**：按需模式的数据流无需容量规划，并且可以自动扩展以处理每分钟数 GB 的写入和读取吞吐量。若采用按需模式，Kinesis Data Streams 会自动管理分片来提供必要的吞吐量。
+  **按需优势**：这是一种账户级模式，可提供更多功能，并简化按需流的定价体系。在此模式下，您可以在任何时间主动预热某个流的写入吞吐能力。对于定价，不再采用固定的流级计费模式，而且所有按需流的数据摄取、数据检索和延长留存使用量比**按需标准**流至少低 60%。
+ **预置**：对于处于预置模式的数据流，您必须指定数据流的分片数量。数据流的总容量是其分片容量的总和。您可以根据需要增加或减少数据流中的分片数。

你可以使用 Kinesis Data `PutRecord` Streams `PutRecords` APIs 和在任何模式下将数据写入数据流。为了检索数据，所有三种模式都支持使用 `GetRecords` API 的默认消费端和使用 `SubscribeToShard` API 的增强型扇出（EFO）消费端。

按需模式和预置模式均支持 Kinesis Data Streams 的所有功能，包括保留模式、加密、监控指标等。Kinesis Data Streams 在按需和预置容量模式下都具有较高持久性和可用性。

## 按需标准模式的特征和用例
<a name="ondemandmode"></a>

按需模式的数据流无需容量规划，并且可以自动扩展以处理每分钟数 GB 的写入和读取吞吐量。按需模式以低延迟的方式简化了摄取和存储大量数据的过程，因为它无需预置和管理服务器、存储或吞吐量。您每天可以摄取数十亿条记录，而不会产生任何运营开销。

按需模式非常适合用于应对高度可变且不可预测的应用程序流量的需求。您不再需要为峰值容量预置这些工作负载，因为峰值容量可能会因为利用率低而导致成本更高。按需模式适用于流量模式不可预测且高度可变的工作负载。

在按需容量模式下，您将按数据流中写入和读取的数据，为每 GB 数据付费。您无需指定预期应用程序执行的读写吞吐量。Kinesis Data Streams 会随着工作负载的增加或减少立即进行调整。有关更多信息，请参阅 [Amazon Kinesis Data Streams 定价](https://www.amazonaws.cn/kinesis/data-streams/pricing/)。

按需模式下的数据流最多可容纳过去 30 天内观察到的峰值写入吞吐量的两倍。当数据流的写入吞吐量达到新的峰值时，Kinesis Data Streams 会自动扩展数据流的容量。例如，如果您的数据流的写入吞吐量在写入吞吐量的 10 MB/s % 到 40MB/s, then Kinesis Data Streams ensures that you can easily burst to double your previous peak throughput, or 80 MB/s. If the same data stream sustains a new peak throughput of 50 MB/s, Kinesis Data Streams ensures that there is enough capacity to ingest 100 MB/s% 之间。但是，如果您的流量在 15 分钟内增加到前一个峰值的两倍以上，则可能会产生写入节流。您需要重试这些受限的请求。

按需模式下的数据流聚合读取容量与写入吞吐量成比例增加。这有助于确保消费端应用程序始终有足够的读取吞吐量来实时处理传入的数据。与使用 `GetRecords` API 读取数据相比，您获得的写入吞吐量至少是其两倍。我们建议您使用带有 `GetRecord` API 的消费端应用程序，这样当应用程序需要从停机时间中恢复时，有足够的空间来赶上。对于需要添加多个消费端应用程序的场景，建议您使用 Kinesis Data Streams 的增强型扇出功能。增强型扇出功能支持使用 `SubscribeToShard` API 将最多 20 个消费端应用程序添加到数据流中，每个消费端应用程序都有专用的吞吐量。

### 处理读写吞吐量异常
<a name="hotshards"></a>

在按需模式（与预置容量模式相同）下，必须为每条记录指定一个分区键，才能将数据写入数据流。Kinesis Data Streams 使用分区键在分片之间分配数据。Kinesis Data Streams 监控每个分片的流量。当 KB/s 每个分片的传入流量超过 500 时，它会在 15 分钟内拆分分该分片。父分片的哈希键值在子分片之间均匀地重新分配。

 如果您的传入流量超过之前峰值的两倍，即使您的数据在分片上均匀分配，您也可能会在约 15 分钟内遇到读取或写入异常的问题。我们建议您重试所有此类请求，以便将所有记录正确存储在 Kinesis Data Streams 中。

如果您使用的分区键会导致数据分配不均匀，并且分配给特定分片的记录超出了其限制，则可能会遇到读写异常的问题。在按需模式下，数据流会自动适应以处理不均匀的数据分配模式，除非单个分区键超过分片的 1 MB/s 吞吐量和每秒 1000 条记录的限制。

在按需模式下，Kinesis Data Streams 在检测到流量增加时会均匀地拆分分片。但是，它不会检测和隔离将更高比例的传入流量传送到特定分片的哈希键。如果您使用的分区键非常不均匀，则可能会继续收到写入异常的提示。对于此类使用案例，我们建议您使用支持精细分片拆分的预置容量模式。

## 按需优势模式的特征和用例
<a name="ondemand-advantage-mode"></a>

按需优势模式是一种账户级设置，可解锁更多功能，并为区域内的所有按需流提供不同的定价体系。在此模式下，按需流仍保留其功能，并根据数据实际使用量继续自动扩缩容量。如果想主动预热某个流的写入吞吐能力，可配置热吞吐量。例如，如果您的数据流的写入吞吐量介于 10 MB/s, you can expect it to handle up to 80MB/s of instant throughput increases without throttling. However, if you forecast an upcoming event to peak around 200MB/s of traffic, you can configure the stream with a warm throughput of 200MB/s 到 40 MB/s 之间，则可以确保在数据吞吐量到达时容量可用。使用热吞吐量不会产生额外费用。

按需优势模式的另一个好处是按需流可以过渡至更简单的定价体系。启用该模式后，账户将不再产生固定的按流计费，您只需处理数据摄取、数据检索和可选的延长留存费用。与按需标准模式相比，每个定价维度都有很大的折扣。有关更多信息，请参阅 [Amazon Kinesis Data Streams 定价](https://www.amazonaws.cn/kinesis/data-streams/pricing/)。

在这种模式下，增强扇出型数据检索也不会产生相较于标准数据检索的价格溢价。此外，在按需优势模式下，您可以为每个直播注册多达 50 个消费者，以使用增强的扇出功能。启用 Ondemand Advantage 会使账户在所有按需流中至少有 25MiB/s of data ingest and 25MiB/s% 的数据检索。对于满足最低使用要求的账户，Kinesis Data Streams 控制台会检查账户的使用模式是否适合使用**按需优势**模式。

如果账户的数据使用量低于要求，则需要对差额付费，但折扣率仍将保持不变。启用按需优势模式之后，至少还需要 24 小时才能禁用此模式。总体而言，如果持续使用的吞吐量接近或超过最低承诺值、需要大量扇出型消费端或使用数百个数据流，则按需优势模式即为使用 Kinesis Data Streams 进行流式传输的最佳方案。

## 预置模式的特征和用例
<a name="provisionedmode"></a>

在预配置模式下，在创建数据流之后，您可以使用或 API 动态地向上或向下扩展分片容量。 Amazon Web Services 管理控制台 [UpdateShardCount](https://docs.amazonaws.cn/kinesis/latest/APIReference/API_UpdateShardCount.html)您可以在 Kinesis Data Streams 创建器或消费端应用程序在向流写入数据或从中读取数据时进行更新。

预置模式适用于容量需求易于预测的可预测流量。如果您想精细控制分片间数据的分配方式，则可以使用预置模式。

若采用预置模式，您必须为数据流指定分片数。要确定预置模式下数据流的大小，您需要以下输入值：
+ 写入流的数据记录的平均大小，以 KB 为单位，四舍五入为 1 KB (`average_data_size_in_KB`)。
+ 每秒写入流和从流读取的数据记录数 (`records_per_second`)。
+ 消费端数量，即并发且独立使用流中数据的 Kinesis Data Streams 应用程序的数量 (`number_of_consumers`)。
+ 以 KB 为单位的传入写入带宽 (`incoming_write_bandwidth_in_KB`)，等于 `average_data_size_in_KB` 乘以 `records_per_second`。
+ 以 KB 为单位的传出读取带宽 (`outgoing_read_bandwidth_in_KB`)，等于 `incoming_write_bandwidth_in_KB` 乘以 `number_of_consumers`。

可使用以下公式中的输入值来计算流所需的分片数量 (`number_of_shards`)。

```
number_of_shards = ceiling(max(incoming_write_bandwidth_in_KiB/1024, outgoing_read_bandwidth_in_KiB/2048))
```

如果您未将数据流配置为处理峰值吞吐量，则在预置模式下仍可能遇到读写吞吐量异常的问题。在这种情况下，您必须手动扩展数据流以适应数据流量。

如果您使用的分区键会导致数据分配不均匀，并且分配给特定分片的记录超出了其限制，则可能也会遇到读写异常的问题。要在预置模式下解决此问题，请确定此类分片并手动拆分，以更好地适应流量。有关更多信息，请参阅[对流进行重新分片](https://docs.amazonaws.cn/streams/latest/dev/kinesis-using-sdk-java-resharding.html)。

## 切换模式
<a name="switchingmodes"></a>

对于中的每个数据流 Amazon Web Services 账户，您可以在 24 小时内在按需模式和预配置模式之间切换两次。切换模式不会对使用该数据流的应用程序造成任何中断。您可以继续读写该数据流。当您在各模式之间切换（从按需切换到预置，或反之）时，流的状态将设置为*正在更新*。必须等待数据流状态变为*活动*，然后才能再次修改其属性。

当您从预置容量模式切换到按需容量模式时，数据流最初会保留转换之前的所有分片数量，从此时起，Kinesis Data Streams 将监控您的数据流量，并根据写入吞吐量扩展此按需数据流的分片数量。当您从按需模式切换到预置模式时，数据流最初也会保留转换之前的所有分片数量，但是从此时起，您将负责监控和调整此数据流的分片数量，以正确适应写入吞吐量。

可以通过启用账户级设置，从**按需标准**模式切换到**按需优势**模式。启用后，该账户承诺在该地区所有按需流中至少 25MiB/s of data ingest and 25MiB/s% 的数据检索使用量。启用后，至少须等待 24 小时才能禁用**按需优势**模式，但您可以随时申请更改。如果要从**按需优势**模式切换到**按需标准**模式，则必须先移除任何配置了按需流的热吞吐量。