

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 執行個體執行。需要由大型生產者提供較高傳輸量的消費者通常會在意每一記錄延遲。處理延遲的策略包括：如果客戶可以微批次/緩衝記錄，在使用單一記錄操作 PutRecord 之前，請使用 [Amazon Kinesis Producer Library](https://docs.aws.amazon.com/kinesis/latest/dev/developing-producers-with-kpl.html) （具有進階彙總邏輯）、多記錄操作 PutRecords [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html)或將記錄彙總到較大的檔案中。 [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html) 如果您無法批次處理/緩衝，請使用多個執行緒同時寫入 Kinesis Data Streams 服務。 適用於 Java 的 AWS SDK 和其他 SDKs 包含可在極少程式碼下執行此操作的非同步用戶端。

**小型生產者**

小型生產者通常是行動應用程式、IoT 裝置或 web 用戶端。如果是行動應用程式，建議您在 AWS Mobile SDKs 中使用 `PutRecords`操作或 Kinesis Recorder。如需詳細資訊，請參閱 適用於 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 金鑰，請參閱[在 AWS KMS 中使用金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)及[搭配 AWS KMS 使用 IAM 政策](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/)