

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 리샤딩 작업 완료
<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`을 반환하면 상위 샤드에서 모든 데이터를 읽었음을 나타냅니다.