Amazon Kinesis Data Streams
開発者ガイド

リシャーディング後

Amazon Kinesis Data Streams でリシャーディングの手順が終了し、通常のレコード処理を再開する前に必要な手順や検討事項があります。以下のセクションでは、これらについて説明します。

ストリームが再度アクティブになるまで待機する

リシャーディングオペレーションとして splitShard または mergeShards のいずれかを呼び出した後、ストリームが再びアクティブになるまで待機する必要があります。使用するコードは、ストリームの作成後にストリームがアクティブになるまで待機する場合のものと同じです。コードは次のとおりです。

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" ); }

リシャーディング後のデータのルーティング、データの永続化、シャードの状態

Kinesis Data Streams はリアルタイムのデータストリーミングサービスです。つまりアプリケーションでは、データがストリーム内のシャードに連続的に流れていることが前提になります。リシャーディングすると、親シャードに流れていたデータレコードは、データレコードのパーティションキーがマッピングされるハッシュキー値に基づいて、子シャードに流れるように再ルーティングされます。ただし、リシャーディング前に親シャードにあったデータレコードはすべて、それらのシャードに残ります。つまり、リシャーディング後に親シャードが失われることはありません。それらのシャードはリシャーディング前に格納されていたデータと共に保持されます。親シャード内のデータレコードには、Kinesis Data Streams API の getShardIterator と getRecords のオペレーションを使用するか、Kinesis Client Libraryを使用してアクセスできます。

注記

データレコードは、現在の保持期間にストリームを追加した時間からアクセスできます。これは、その期間内のストリームのシャードの変更に関係なく当てはまります。ストリームの保持期間の詳細については、「データ保持期間の変更」を参照してください。

リシャーディングの過程で、親シャードは OPEN 状態から CLOSED 状態に、さらに EXPIRED 状態へと移行します。

  • OPEN: リシャーディングオペレーションの前、親シャードは OPEN 状態にあります。つまり、データレコードはシャードへの追加とシャードからの取得のいずれも可能です。

  • CLOSED: リシャーディングオペレーションの後、親シャードは CLOSED 状態に移行します。つまり、データレコードはシャードに追加されなくなります。このシャードに追加されることになっていたデータレコードは、子シャードに追加されるようになります。ただし、データレコードは引き続き、制限された時間内にシャードから取得できます。

  • 期限切れ: ストリーム保持期間の有効期限が切れたら、親シャードのすべてのデータレコードの期限も切れてアクセスできなくなります。この時点で、シャード自体は EXPIRED 状態に移行します。getStreamDescription().getShards を呼び出してストリーム内のシャードを列挙しても、返されるシャードのリストには 状態のシャードは含まれません。EXPIREDストリームの保持期間の詳細については、「データ保持期間の変更」を参照してください。

リシャーディング後、ストリームが再び ACTIVE 状態になるとすぐに、子シャードからのデータの読み取りを開始できます。ただし、リシャーディング後に残った親シャードには、リシャーディング前にストリームに追加されてまだ読み取られていないデータがそのまま格納されている可能性があります。親シャードからすべてのデータを読み取る前に、子シャードからデータを読み取った場合は、特定のハッシュキーが原因で、読み取ったデータがデータレコードのシーケンス番号に基づいた順序に並ばない可能性があります。したがって、データの順序が重要である場合は、リシャーディング後そのデータを使い切るまで、親シャードからのデータの読み取りを続行する必要があります。子シャードからのデータの読み取りは必ずその後で開始してください。getRecordsResult.getNextShardIterator が を返した場合は、親シャード内のすべてのデータを読み取ったということです。nullKinesis Client Libraryを使用してデータを読み取る場合は、リシャーディング後でも正しい順序でデータを受け取ることができます。