

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

# 完成重新分片動作
<a name="kinesis-using-sdk-java-after-resharding"></a>

在 Amazon Kinesis Data Streams 中任何種類的重新分片程序之後，以及在繼續正常記錄處理之前，需要其他程序和考量。下列小節描述這些情況。

**Topics**
+ [等待串流再次變成作用中](#kinesis-using-sdk-java-resharding-wait-until-active)
+ [考慮重新碎片之後的資料路由、資料持久性和碎片狀態](#kinesis-using-sdk-java-resharding-data-routing)

## 等待串流再次變成作用中
<a name="kinesis-using-sdk-java-resharding-wait-until-active"></a>

呼叫重新分片操作 `splitShard`或 之後`mergeShards`，您必須等待串流再次變成作用中。要使用的程式碼與[建立串流](kinesis-using-sdk-java-create-stream.md)之後，等待串流變得作用中的程式碼相同。該程式碼如下所示：

```
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );

long startTime = System.currentTimeMillis();
long endTime = startTime + ( 10 * 60 * 1000 );
while ( System.currentTimeMillis() < endTime ) 
{
  try {
    Thread.sleep(20 * 1000);
  } 
  catch ( Exception e ) {}
  
  try {
    DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest );
    String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus();
    if ( streamStatus.equals( "ACTIVE" ) ) {
      break;
    }
   //
    // sleep for one second
    //
    try {
      Thread.sleep( 1000 );
    }
    catch ( Exception e ) {}
  }
  catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) 
{
  throw new RuntimeException( "Stream " + myStreamName + " never went active" );
}
```

## 考慮重新碎片之後的資料路由、資料持久性和碎片狀態
<a name="kinesis-using-sdk-java-resharding-data-routing"></a>

Kinesis Data Streams 是一種即時資料串流服務。您的應用程式應該假設資料持續流經串流中的碎片。執行重新分片時，流動至父碎片的資料記錄會重新路由，以根據資料記錄分割區索引鍵所對應的雜湊索引鍵值，流動至子碎片。不過，重新分片之前在父碎片中的任何資料記錄，會維持在那些碎片中。重新碎片發生時，父碎片不會消失。它們會隨著重新分片之前包含的資料保留。父碎片中的資料記錄可使用 Kinesis Data Streams API 中的 [`getShardIterator` 和 `getRecords`](developing-consumers-with-sdk.md#kinesis-using-sdk-java-get-data) 操作或透過 Kinesis Client Library 存取。

**注意**  
資料記錄可供存取的時間是從新增至串流的時間到目前的保留期間。無論在該時間期間對串流中的碎片進行任何變更，都是如此。如需串流保留期間的詳細資訊，請參閱[變更資料保留期間](kinesis-extended-retention.md)。

在重新分片的程序中，父碎片會從 `OPEN` 狀態轉換為 `CLOSED` 狀態然後為 `EXPIRED` 狀態。
+  **OPEN**：重新分片操作之前，父碎片會處於 `OPEN` 狀態，這表示資料記錄可同時新增至碎片和從碎片中擷取。
+  **CLOSED**：重新分片操作之後，父碎片會轉換為 `CLOSED` 狀態。這表示資料記錄不再會新增至碎片。應新增至此碎片的資料記錄，現在會改為新增至子碎片。不過，您仍可以在限定時間內從碎片擷取資料記錄。
+  **EXPIRED**：在串流的保留期過期之後，父碎片中的所有資料記錄會過期，並不再可供存取。此時，碎片本身會轉換為 `EXPIRED` 狀態。為了列舉串流中碎片對 `getStreamDescription().getShards` 的呼叫，在傳回的清單碎片中不會包含 `EXPIRED` 碎片。如需串流保留期間的詳細資訊，請參閱[變更資料保留期間](kinesis-extended-retention.md)。

重新分片發生且串流再次處於 `ACTIVE` 狀態之後，您可以立即開始從子碎片讀取資料。不過，在重新碎片之後保留的父碎片可能仍然包含您尚未讀取，且在重新碎片之前新增至串流的資料。如果您在從父碎片讀取所有資料之前從子碎片讀取資料，則可以不按資料記錄的序號指定的順序讀取特定雜湊索引鍵的資料。因此，假設資料的順序很重要，在重新分片之後，您應該一律持續從父碎片讀取資料，直至耗盡為止。只有這樣您才應該從子碎片開始讀取資料。當 `getRecordsResult.getNextShardIterator` 傳回 `null`，表示您已讀取父碎片中的所有資料。