

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

# Amazon Kinesis Data Streams 产生器问题排查
<a name="troubleshooting-producers"></a>

**Topics**
+ [产生器应用程序的写入速率比预期的慢](#producer-writing-at-slower-rate)
+ [我收到了未授权的 KMS 主密钥权限错误](#unauthorized-kms-producer)
+ [排查产生器的其他常见问题](#misc-troubleshooting-producer)

## 产生器应用程序的写入速率比预期的慢
<a name="producer-writing-at-slower-rate"></a>

**Topics**
+ [超过服务限制](#service-limits-exceeded)
+ [我想优化我的产生器](#producer-optimization)
+ [滥用 `flushSync()` 操作](#misuse-tag)

### 超过服务限制
<a name="service-limits-exceeded"></a>

要查明是否超过了服务限制，请检查您的创建器是否从服务引发了吞吐量异常，并验证哪些 API 操作受限制。请记住，根据调用会有不同的限制，具体请参阅[限额和限制](service-sizes-and-limits.md)。例如，除了最广为人知的对读写操作的分片级别限制之外，还存在以下流级别的限制：
+ [CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html)
+ [DeleteStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DeleteStream.html)
+ [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html)
+ [GetShardIterator](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html)
+ [MergeShards](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_MergeShards.html)
+ [DescribeStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStream.html)
+ [DescribeStreamSummary](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStreamSummary.html)

操作 `CreateStream`、`DeleteStream`、`ListStreams`、`GetShardIterator` 和 `MergeShards` 限制为每秒 5 个调用。`DescribeStream` 操作限制为每秒 10 个调用。`DescribeStreamSummary` 操作限制为每秒 20 个调用。

如果这些调用不存在问题，请确保您选择了允许在所有分片之间均匀分配 *put* 操作的分区键，并且没有某个特殊分区键无意中达到了服务限制而其他分区键则未达到限制。这要求您衡量高峰吞吐量并考虑流中的分片数量。有关管理流的详细信息，请参阅[创建和管理 Kinesis 数据流](working-with-streams.md)。

**提示**  
请记住，在使用单记录操作 [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html) 时，吞吐量限制计算会向上舍入到最接近的 KB 值，而多记录操作 [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html) 对各个调用中记录的累加和进行舍入。例如，带有 600 个 1.1 KB 大小记录的 `PutRecords` 请求不会受到限制。

### 我想优化我的产生器
<a name="producer-optimization"></a>

在您开始优化产生器之前，请完成以下关键任务。首先，根据记录大小和每秒记录数，确定您需要的高峰吞吐量。接下来，排除流容量作为限制因素 ([超过服务限制](#service-limits-exceeded)) 的可能性。如果您已排除了流容量，对于两种常见类型的创建器，请使用以下故障排除提示和优化指南。

**大型创建器**

大型创建器通常从本地服务器或 Amazon EC2 实例运行。需要由大型创建器提供较高吞吐量的客户通常会关注每记录延迟。处理延迟的策略包括以下内容：如果客户可以对记录进行微批处理/缓冲，请在使用单记录操作之前使用 [Amazon Kinesis Producer 库](https://docs.aws.amazon.com/kinesis/latest/dev/developing-producers-with-kpl.html)（具有高级聚合逻辑）[PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html)、多记录操作或将记录聚合到更大的文件中。[PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html)如果无法批处理/缓冲，则使用多个线程来同时写入到 Kinesis Data Streams 服务。 适用于 Java 的 AWS SDK 和其他 SDKs 包括异步客户端，它们只需很少的代码即可完成此操作。

**小型创建器**

小型创建器通常是移动应用程序、IoT 设备或 Web 客户端。如果是移动应用程序，我们建议在移动设备中使用该`PutRecords`操作或Kinesis Recorder。 AWS SDKs有关更多信息，请参阅《 适用于 Android 的 AWS Mobile SDK 入门指南》和《 AWS Mobile SDK for iOS 入门指南》。移动应用程序自身必须处理断续连接，并且需要某种类型的批量 put，例如 `PutRecords`。如果由于某些原因而无法批处理，请参阅上面的大型创建器信息。如果您的创建器是浏览器，则生成的数据量通常非常小。不过，您将 *put* 操作放在了应用程序的关键路径上，我们建议不要这样做。

### 滥用 `flushSync()` 操作
<a name="misuse-tag"></a>

使用 `flushSync()` 不当会严重影响写入性能。`flushSync()` 操作专为关闭场景而设计，用于确保在 KPL 应用程序终止之前发出所有缓冲记录。如果在每次写入操作后都执行此操作，则可能会增加大量额外的延迟，每次写入延迟约 500 毫秒。请确保仅在应用程序关闭时实现 `flushSync()`，以避免写入性能产生不必要的额外延迟。

## 我收到了未授权的 KMS 主密钥权限错误
<a name="unauthorized-kms-producer"></a>

当创建者应用程序在 KMS 主密钥上写入加密流但没有权限时，会发生此错误。要为应用程序分配权限以访问 KMS 密钥，请参阅 [Using Key Policies in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) 和 [Using IAM Policies with AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。

## 排查产生器的其他常见问题
<a name="misc-troubleshooting-producer"></a>
+ [为什么我的 Kinesis 数据流会返回一个 500 内部服务器错误？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-stream-500-error/)
+ [我如何排查从 Flink 写入 Kinesis Data Streams 时发生的超时错误？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-flink-timeout/)
+ [如何排查 Kinesis Data Streams 中的节流错误问题？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-stream-throttling-errors/)
+ [为什么我的 Kinesis 数据流会节流？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-stream-throttling/)
+ [如何使用 KPL 将数据记录放入 Kinesis 数据流中？](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-stream-kpl/)